web-dev-qa-db-fra.com

Comment faire fonctionner Flask sur le port 80?

J'ai un serveur Flask fonctionnant sur le port 5000 et tout va bien. Je peux y accéder à http://example.com:5000

Mais est-il possible d'y accéder simplement à l'adresse http://example.com ? Je suppose que cela signifie que je dois changer le port de 5000 à 80. Mais lorsque j'essaie cela sur Flask, je reçois ce message d'erreur lorsque je l'exécute.

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(Host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(Host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

lsof -i :80 retourne 

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
Apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

Dois-je d'abord tuer ces processus? Est-ce sécuritaire? Ou existe-t-il un autre moyen de continuer à utiliser Flask sur le port 5000, tout en ayant la redirection du domaine de site Web principal?

Merci.

137
quantumtremor

Donc, ce message d’erreur s’affiche parce que Apache2 est exécuté sur le port 80.

S'il s'agit d'un développement, je le laisserais tel quel sur le port 5000.

Si c'est pour la production soit:

Non recommandé

  • Arrêtez Apache2 en premier; 

Non recommandé comme indiqué dans la documentation:

Vous pouvez utiliser le serveur intégré pendant le développement, mais vous devez utiliser une option de déploiement complet pour les applications de production. (N'utilisez pas le serveur de développement intégré en production.)

Conseillé

  • Trafic de proxy HTTP via Apache2 vers un flacon.

De cette façon, Apache2 peut gérer tous vos fichiers statiques (ce qui est très bien, bien mieux que le serveur de débogage intégré à Flask) et agir en tant que proxy inverse pour votre contenu dynamique, en transmettant ces demandes à Flask.

Voici un lien vers la documentation officielle sur la configuration de Flask avec Apache + mod_wsgi.

Edit 1 - Clarification pour @Djack

Trafic HTTP proxy vers Flask via Apache2

Lorsqu'une demande parvient au serveur sur le port 80 (HTTP) ou le port 443 (HTTPS), un serveur Web tel qu'Apache ou Nginx gère la connexion de la demande et détermine la procédure à suivre. Dans notre cas, une demande reçue doit être configurée pour être transmise à Flask sur le protocole WSGI et gérée par le code Python. C'est la partie "dynamique". 

proxy inverse pour le contenu dynamique

La configuration de votre serveur Web présente les avantages suivants: 

  • Terminaison SSL - Le serveur Web sera optimisé pour traiter les demandes HTTPS avec seulement une petite configuration. Ne "roulez pas le vôtre" en Python, ce qui est probablement très peu sûr en comparaison.
  • Sécurité - L’ouverture d’un port sur Internet nécessite une attention particulière à la sécurité. Le serveur de développement de Flask n'est pas conçu pour cela et pourrait présenter des bogues ouverts ou des problèmes de sécurité par rapport à un serveur Web conçu à cet effet. Notez qu'un serveur Web mal configuré peut aussi être peu sûr! 
  • Gestion des fichiers statiques - Il est possible que le serveur Web Flask intégré gère les fichiers statiques, mais cela n’est pas recommandé. Nginx/Apache sont beaucoup plus efficaces pour gérer des fichiers statiques tels que des images, CSS, des fichiers Javascript et ne transmet que les requêtes "dynamiques" (celles où le contenu est souvent lu à partir d'une base de données ou les modifications de contenu) à traiter par le code Python. 
  • + plus Ceci est à la limite de la portée de cette question. Si vous souhaitez plus d’informations, faites des recherches dans ce domaine. 
53
Ewan

1- Arrêtez les autres applications utilisant le port 80 . 2- Exécutez l'application avec le port 80:

if __== '__main__':
      app.run(Host='0.0.0.0', port=80)
307
Amir Mofakhar

Pour un serveur visible de l'extérieur, où vous n'utilisez pas Apache ou un autre serveur Web, vous tapez simplement 

flask run --Host=0.0.0.0 --port=80
84
Harun-Ur-Rashid

Si vous utilisez les éléments suivants pour modifier le port ou l'hôte:

if __== '__main__':
  app.run(Host='0.0.0.0', port=80)

utilisez le code suivant pour démarrer le serveur (mon entrée principale pour flask est app.py):

python app.py

à la place d'utiliser:

flask run
7
muca

Votre problème est que vous avez déjà un serveur Web Apache en cours d’exécution qui utilise déjà le port 80. Vous pouvez donc:

  1. Kill Apache: Vous devriez probablement le faire via /etc/init.d/Apache2 stop, plutôt que de simplement les tuer.

  2. Déployez votre application de flacon dans votre processus Apache, sous la forme flask dans Apache .

6
sebastian

Si vous voulez que votre application soit sur le même port, i.e port = 5000, exécutez la commande suivante dans votre terminal:

fuser -k 5000/tcp

puis lancez:

python app.py

Si vous souhaitez exécuter sur un port spécifié, par exemple si vous voulez utiliser le port = 80, dans votre fichier principal, mentionnez simplement ceci:

if __== '__main__':  
    app.run(Host='0.0.0.0', port=80)
5
Alok Singh

Vous n'avez pas besoin de changer le numéro de port de votre application, il vous suffit de configurer votre serveur www (nginx ou Apache) pour que les requêtes proxy se fassent sur le port du flacon. Payez attantion sur uWSGI.

3
greg

La solution la plus simple et la meilleure

Enregistrez votre fichier .py dans un dossier. Cette affaire mon nom de dossier est test. Dans l'invite de commande, exécutez ce qui suit

c:\test> set FLASK_APP=application.py
c:\test> set flasK_RUN_PORT=8000
c:\test> flask run

----------------- Après sera retourné ----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

Maintenant, sur votre navigateur, tapez: http://127.0.0.1:80 . Merci

0
Jagannath Banerjee

définissez le port avec app.run(port=80,debug=True)vous devriez définir debug à true lorsque vous êtes sur dev

0
valentine

Je ne peux pas démarrer mon application à 80 ans, mais bien à 5000. Je ne vois pas Apache en cours d'exécution? Que puis-je vérifier? Nous voulons exécuter sur 80 afin que nous puissions utiliser l'URL sans spécifier le port.

>     server.run(debug=False, Host=args.Host, port=args.port)   File "/home/ryanicky/.local/lib/python3.6/site-packages/flask/app.py", line
> 944, in run
>     run_simple(Host, port, self, **options)   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 1009, in run_simple
>     inner()   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 962, in inner
>     fd=fd,   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 805, in make_server
>     Host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd   File
> "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 698, in __init__
>     HTTPServer.__init__(self, server_address, handler)   File "/usr/lib64/python3.6/socketserver.py", line 456, in __init__
>     self.server_bind()   File "/usr/lib64/python3.6/http/server.py", line 136, in server_bind
>     socketserver.TCPServer.server_bind(self)   File "/usr/lib64/python3.6/socketserver.py", line 470, in server_bind
>     self.socket.bind(self.server_address) OSError: [Errno 98] Address already in use [ryanicky@webstr WebSTR]$ systemctl status httpd Unit
> httpd.service could not be found.
0
user2945234

Je devais définir FLASK_RUN_PORT dans mon environnement sur le numéro de port spécifié. Le quand j'ai commencé l'application, il a ramassé le port que je voulais.

0
cathaldcronin1