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.
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é
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é
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:
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)
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
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
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:
Kill Apache: Vous devriez probablement le faire via /etc/init.d/Apache2 stop
, plutôt que de simplement les tuer.
Déployez votre application de flacon dans votre processus Apache, sous la forme flask dans Apache .
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)
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
.
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
définissez le port avec app.run(port=80,debug=True)
vous devriez définir debug à true lorsque vous êtes sur dev
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.
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.