Comment faire exécuter Flask sur le port 80?

212

J'ai un serveur Flask passant par le port 5000, et ça va. Je peux y accéder sur http://example.com:5000

Mais est-il possible d'y accéder simplement sur 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

Exécution des lsof -i :80retours

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ûr? Ou existe-t-il un autre moyen de faire fonctionner Flask sur le port 5000 mais de rediriger le domaine du site Web principal d'une manière ou d'une autre?

quantumtremor
la source
vous pouvez l'utiliser flacon avec apache .
Syed Habib M
3
le titre de la question ne correspond pas à la question. il devrait peut-être lire «comment ne pas faire fonctionner d'autres choses sur le port 80». Je suis curieux de savoir comment changer le flacon de port sur lequel s'exécute cette question, mais il n'est jamais mentionné ici
Elliot Woods

Réponses:

76

Il lance donc ce message d'erreur car vous avez apache2exécuté sur le port 80.

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

Si c'est pour la production:

Non recommandé

  • Arrêtez d' apache2abord;

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é

  • HTTPTrafic proxy via apache2Flask.

De cette façon, apache2peut gérer tous vos fichiers statiques (ce qui est très bon - beaucoup mieux que le serveur de débogage intégré à Flask) et agir comme un 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 comme Apache ou Nginx gère la connexion de la demande et détermine ce qu'il faut en faire. 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. Il s'agit de la partie "dynamique".

proxy inverse pour le contenu dynamique

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

  • Terminaison SSL - Le serveur Web sera optimisé pour gérer les requêtes HTTPS avec seulement un peu de configuration. Ne "roulez pas" en Python, ce qui est probablement très peu sûr en comparaison.
  • Sécurité - L'ouverture d'un port à 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 avoir 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 également être peu sûr!
  • Gestion des fichiers statiques - Il est possible que le serveur Web intégré de Flask gère les fichiers statiques, mais ce n'est pas recommandé; Nginx / Apache sont beaucoup plus efficaces pour gérer les fichiers statiques comme les images, CSS, les fichiers Javascript et ne transmet que les requêtes "dynamiques" (celles où le contenu est souvent lu dans une base de données ou les modifications de contenu) pour être traitées par le code Python.
  • + plus. Cela frôle la portée de cette question. Si vous voulez plus d'informations, faites des recherches dans ce domaine.
Ewan
la source
Voilà une excellente réponse en effet! Pouvez-vous démystifier en langage simple le jargon hautement technique que vous avez utilisé " Proxy HTTP traffic to Flask through apache2" et " reverse proxy for dynamic content"?
John Strood
2
@Djack - réponse mise à jour mais elle est à la limite de la portée de la question, veuillez donc effectuer une recherche en ligne pour plus d'informations.
Ewan
1
Merci d'avoir fourni les mots clés. Je ferai sûrement une recherche en ligne.
John Strood
419

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

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
la source
1
fonctionne bien, uniquement dans un environnement Windows., quand Apache est absent .. :)
jOSe
1
Ça ne fonctionne pas pour moi. cela devrait être: flask run --host = 0.0.0.0
Harun-Ur-Rashid
1
@jOSe J'ai essayé d'utiliser PyCharm sur Ubuntu, ça marche très bien.
Bugs Buggy
@jOSe Apache n'est pas nécessaire pour que Linux fonctionne, vous pouvez le désinstaller ou changer son port.
nurettin
145

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

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
la source
Cette commande peut-elle être exécutée en utilisant des vars env? Je continue d'essayer CMD flask run --host=0.0.0.0 --port=$PORTdans mon Dockerfile (pour des raisons de Heroku) et je reçois toujours des erreurs sur la nécessité d'avoir un entier pour mon port
Smokin Joe
Cela a bien fonctionné sur mon ordinateur portable local, mais lorsque je l'ai utilisé sur mon instance AWS EC2, il est indiqué "Autorisation refusée". Si j'ajoute "sudo" au début, la commande "flask" n'est pas reconnue ...
user3768495
1
@ user3768495 Peut-être que flask n'est pas installé dans l'utilisateur root (sudo)
Harun-Ur-Rashid
2
Salut @ Harun-Ur-Rashid, c'est probablement le cas - je l'ai installé dans un environnement virtuel. Je vais voir comment y remédier. Merci pour votre réponse.
user3768495
22

Si vous utilisez ce qui suit pour modifier le port ou l'hôte:

if __name__ == '__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
muca
la source
10

Si vous voulez que votre application sur le même port, c'est-à-dire port = 5000, alors juste dans votre terminal exécutez cette commande:

fuser -k 5000/tcp

puis exécutez:

python app.py

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

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)
Alok Singh
la source
8

Un moyen pratique est d'utiliser le package python-dotenv: il lit un .flaskenvfichier dans lequel vous pouvez stocker des variables d'environnement pour flask.

  • pip install python-dotenv
  • créer un fichier .flaskenvdans le répertoire racine de votre application

Dans le fichier que vous spécifiez:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Après cela, il vous suffit d'exécuter votre application avec flask runet d'accéder à votre application sur ce port.

Veuillez noter que par FLASK_RUN_HOSTdéfaut 127.0.0.1et par FLASK_RUN_PORTdéfaut 5000.

jorop
la source
8

C'est la seule solution qui a fonctionné pour moi sur Ubuntu-18.

Dans le fichier app.py, utilisez:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

Le code ci-dessus donnera la même erreur d'autorisation sauf s'il sudoest utilisé pour l'exécuter:

sudo python3 app.py
Ibrahim
la source
6

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 flask dans votre processus apache, comme décrit flask dans apache .

Sébastien
la source
5

J'ai dû définir FLASK_RUN_PORTdans mon environnement le numéro de port spécifié. La prochaine fois que vous lancerez votre application, Flask chargera cette variable d'environnement avec le numéro de port que vous avez sélectionné.

Cathal Cronin
la source
3

Vous n'avez pas besoin de changer le numéro de port pour votre application, il suffit de configurer votre serveur www (nginx ou apache) pour des requêtes proxy sur le port flask. Faites attention uWSGI.

Greg
la source
3

définissez le port avec app.run(port=80,debug=True) vous devez définir le débogage sur true lorsque le dev

Valentin
la source
2

La solution la plus simple et la meilleure

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

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

----------------- Ce qui suit 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 type de navigateur: http://127.0.0.1:8000 . Merci

Jagannath Banerjee
la source
Il doit l'exécuter sur 80 qui est un port spécial. Il doit d'abord arrêter d'autres choses.
Ahmedn1
1

Dans mon scénario, les étapes suivantes ont fonctionné comme un charme:

  • Installation du package:

    pip install --upgrade pip
    pip install python-dotenv
  • Créer un fichier caché dans mon répertoire d'application "flaskr / .flaskenv"

  • Ajout du contenu suivant:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Enfin, exécutez la commande flask une fois de plus:

    flask run
  • La version sur laquelle je travaille est:

    pip freeze |grep -i flask
    Flask==1.1.1
Manuel Lazo
la source