Ich habe einen Flask-Server, der über Port 5000 läuft, und es ist in Ordnung. Ich kann darauf zugreifen unter http://example.com:5000
Aber ist es möglich, einfach unter http://example.com darauf zuzugreifen? Ich gehe davon aus, dass ich den Port von 5000 auf 80 ändern muss. Wenn ich das aber auf Flask versuche, erhalte ich diese Fehlermeldung, wenn ich es ausführe.
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
Das Ausführen von lsof -i :80
wird zurückgegeben
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)
Muss ich diese Prozesse zuerst beenden? Ist das sicher? Oder gibt es eine andere Möglichkeit, Flask auf Port 5000 zu betreiben, aber die Domäne der Hauptwebsite irgendwie umzuleiten?
Vielen Dank.
Es wird also diese Fehlermeldung ausgegeben, da auf Port 80 Apache2
ausgeführt wird.
Wenn dies für die Entwicklung gedacht ist, würde ich es einfach auf Port 5000 belassen.
Wenn es für die Produktion ist:
Nicht empfohlen
Apache2
zuerst anhalten; Nicht empfohlen, da in der Dokumentation angegeben:
Sie können den integrierten Server während der Entwicklung verwenden, Sie sollten jedoch eine vollständige Bereitstellungsoption für Produktionsanwendungen verwenden. (Verwenden Sie den integrierten Entwicklungsserver nicht in der Produktion.)
Empfohlen
HTTP
Verkehr durch Apache2
zur Flasche.Auf diese Weise kann Apache2
alle Ihre statischen Dateien verarbeiten (was sehr gut ist - viel besser als der in Flask integrierte Debug-Server) und als Reverse-Proxy für Ihren dynamischen Inhalt fungieren, der diese Anforderungen an Flask weiterleitet.
Hier ist ein Link zur offiziellen Dokumentation zum Einrichten von Flask mit Apache + mod_wsgi.
Edit 1 - Klarstellung für @Djack
Proxy-HTTP-Verkehr zur Flasche über Apache2
Wenn eine Anforderung an Port 80 (HTTP
) oder Port 443 (HTTPS
) an den Server gesendet wird, verarbeitet ein Webserver wie Apache oder Nginx die Verbindung der Anfrage und ermittelt, was damit zu tun ist. In unserem Fall sollte eine erhaltene Anfrage so konfiguriert sein, dass sie über das WSGI-Protokoll an Flask weitergeleitet und vom Python-Code verarbeitet wird. Dies ist der "dynamische" Teil.
reverse Proxy für dynamischen Inhalt
Die Konfiguration Ihres Webservers bietet einige Vorteile, wie oben beschrieben.
1- Stoppen Sie andere Anwendungen, die Port 80 ... verwenden. 2- Führen Sie die Anwendung mit Port 80 aus:
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
Bei extern sichtbaren Servern, bei denen Sie weder Apache noch einen anderen Webserver verwenden, geben Sie diesen einfach ein
flask run --Host=0.0.0.0 --port=80
Wenn Sie den Port oder den Host folgendermaßen ändern:
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
verwenden Sie den folgenden Code, um den Server zu starten (mein Haupteingang für flask ist app.py):
python app.py
anstelle von:
flask run
Ihr Problem ist, dass bereits ein Apache-Webserver ausgeführt wird, der bereits Port 80 verwendet. Sie können also entweder:
Apache töten: Sie sollten dies wahrscheinlich über /etc/init.d/Apache2 stop
tun, anstatt sie einfach zu töten.
Stellen Sie Ihre Flaschen-App in Ihrem Apache-Prozess bereit, wie in flask in Apache beschrieben.
Wenn Sie möchten, dass sich Ihre Anwendung auf demselben Port befindet, d. H. Port = 5000, führen Sie einfach in Ihrem Terminal den folgenden Befehl aus:
fuser -k 5000/tcp
und dann laufen:
python app.py
Wenn Sie an einem bestimmten Port arbeiten möchten, z. Wenn Sie auf Port = 80 ausführen möchten, geben Sie in Ihrer Hauptdatei Folgendes an:
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
Sie müssen die Portnummer für Ihre Anwendung nicht ändern. Konfigurieren Sie Ihren WWW-Server (Nginx oder Apache) so, dass Proxy-Abfragen an den Flaschenport erfolgen. Achten Sie auf uWSGI
.
Einfachste und beste Lösung
Speichern Sie Ihre .py-Datei in einem Ordner. In diesem Fall lautet mein Ordnername test. Führen Sie in der Eingabeaufforderung Folgendes aus
c:\test> set FLASK_APP=application.py
c:\test> set flasK_RUN_PORT=8000
c:\test> flask run
----------------- Folgendes wird zurückgegeben ----------------
* 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 -
Geben Sie nun in Ihrem Browser Folgendes ein: http://127.0.0.1:80 . Vielen Dank
setze den Port mit app.run(port=80,debug=True)
Du solltest Debug auf true setzen, wenn auf dev
Ich kann meine App nicht auf 80 starten, sondern auf 5000. Apache läuft nicht? Was kann ich sonst noch überprüfen? Wir wollen auf 80 laufen, damit wir die URL ohne Angabe des Ports verwenden können.
> 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 [[email protected] WebSTR]$ systemctl status httpd Unit
> httpd.service could not be found.
Ich musste FLASK_RUN_PORT
in meiner Umgebung auf die angegebene Portnummer einstellen. Als ich die App gestartet habe, habe ich den Port gefunden, den ich wollte.