Comment faire pour que Flask fonctionne sur le port 80 ?

J'ai un serveur Flask qui fonctionne sur le port 5000, et tout va bien. Je peux y accéder à l'adresse 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, j'obtiens 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

L'exécution de 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 sans danger ? Ou existe-t-il un autre moyen de faire fonctionner Flask sur le port 5000 tout en redirigeant le domaine du site principal ?

Solution

Donc, ce message d'erreur s'affiche parce que apache2 tourne sur le port 80.

Si c'est pour le développement, je laisserais simplement le port 5000 tel quel.

Si c&#8217est pour la production aussi :

Non recommandé

  • Arrêtez d'abord apache2 ;

Non recommandé comme il est 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 builtin en production).

Recommandé

  • Proxy le trafic HTTP à travers apache2 vers Flask.

De cette façon, apache2 peut gérer tous vos fichiers statiques (ce qu'il fait très bien - bien mieux que le serveur de débogage intégré à Flask) et agir comme un proxy inverse pour votre contenu dynamique, en passant ces requêtes à Flask.

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

Edit 1 - Clarification pour @Djack

Proxy du trafic HTTP vers Flask via apache2

Lorsqu'une requête arrive sur le serveur sur le port 80 (HTTP) ou le port 443 (HTTPS), un serveur web comme Apache ou Nginx gère la connexion de la requête et trouve quoi en faire. Dans notre cas, une requête reçue doit être configurée pour être transmise à Flask sur le protocole WSGI et traitée par le code Python. C'est la partie "dynamique&quot ;.

reverse proxy pour contenu dynamique

Il y a quelques avantages à configurer votre serveur web comme ci-dessus ;

  • Terminaison SSL - Le serveur web sera optimisé pour traiter les requêtes HTTPS avec seulement un peu de configuration. Ne faites pas de "roll your own" en Python, qui est probablement très peu sûr en comparaison.
  • Sécurité - L'ouverture d'un port vers l'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 dans ce but. Notez qu'un serveur web mal configuré peut également être peu sûr !
  • Gestion des fichiers statiques - Il est possible pour le serveur web intégré de Flask de gérer les fichiers statiques, mais ce n'est pas recommandé ; Nginx/Apache sont beaucoup plus efficaces pour gérer les fichiers statiques comme les images, les CSS, les fichiers Javascript et ne laisseront que les requêtes "dynamiques" (celles où le contenu est souvent lu depuis une base de données ou le contenu change) être gérées par le code Python.
  • Plus encore. C'est à la limite du champ d'application de cette question. Si vous voulez plus d'informations, faites des recherches dans ce domaine.
Commentaires (3)

Votre problème est que vous avez un serveur web Apache en cours d'exécution qui utilise déjà le port 80. Donc, vous pouvez soit :

  1. Arrêter apache : Vous devriez probablement le faire via /etc/init.d/apache2 stop, plutôt que de simplement les tuer.

  2. Déployez votre application flask dans votre processus apache, comme [flask in apache][1] le décrit.

[1] : http://flask.pocoo.org/docs/deploying/mod_wsgi/#configuring-apache

Commentaires (0)

Vous n'avez pas besoin de changer le numéro de port de votre application, il suffit de configurer votre serveur www (nginx ou apache) pour que les requêtes soient dirigées vers le port flask. Faites attention à uWSGI.

Commentaires (0)