it-swarm.com.de

Wie bekomme ich Flask für Port 80?

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.

137
quantumtremor

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

  • Proxy 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. 

  • SSL-Beendigung - Der Webserver wird für die Bearbeitung von HTTPS-Anforderungen mit nur geringer Konfiguration optimiert. Rollen Sie in Python nicht selbst, was im Vergleich wahrscheinlich sehr unsicher ist.
  • Sicherheit - Das Öffnen eines Ports zum Internet erfordert eine sorgfältige Prüfung der Sicherheit. Der Entwicklungsserver von Flask ist nicht dafür ausgelegt und kann im Vergleich zu einem für diesen Zweck entwickelten Webserver offene Fehler oder Sicherheitsprobleme aufweisen. Beachten Sie, dass ein schlecht konfigurierter Webserver auch unsicher sein kann! 
  • Statische Dateibehandlung - Der integrierte Flask-Webserver kann statische Dateien verarbeiten, dies wird jedoch nicht empfohlen. Nginx/Apache ist beim Umgang mit statischen Dateien wie Bildern, CSS und Javascript-Dateien viel effizienter und gibt nur "dynamische" Anforderungen (bei denen der Inhalt häufig aus einer Datenbank gelesen wird oder der Inhalt geändert wird) an den Python-Code weiter. 
  • + mehr Dies grenzt an den Spielraum für diese Frage. Wenn Sie weitere Informationen wünschen, recherchieren Sie in diesem Bereich. 
53
Ewan

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)
307
Amir Mofakhar

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
84
Harun-Ur-Rashid

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
7
muca

Ihr Problem ist, dass bereits ein Apache-Webserver ausgeführt wird, der bereits Port 80 verwendet. Sie können also entweder:

  1. Apache töten: Sie sollten dies wahrscheinlich über /etc/init.d/Apache2 stop tun, anstatt sie einfach zu töten.

  2. Stellen Sie Ihre Flaschen-App in Ihrem Apache-Prozess bereit, wie in flask in Apache beschrieben.

6
sebastian

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)
5
Alok Singh

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.

3
greg

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

0

setze den Port mit app.run(port=80,debug=True) Du solltest Debug auf true setzen, wenn auf dev

0
valentine

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.
0
user2945234

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.

0
cathaldcronin1