Wie kann ich Flask auf Port 80 ausführen?

212

Ich habe einen Flask-Server, der über Port 5000 läuft, und es ist in Ordnung. Ich kann unter http://example.com:5000 darauf zugreifen

Aber ist es möglich, einfach unter http://example.com darauf zuzugreifen ? Ich gehe davon aus, dass dies bedeutet, dass ich den Port von 5000 auf 80 ändern muss. Aber wenn ich das 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

Running lsof -i :80kehrt zurück

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 am Laufen zu halten, aber die Domain der Hauptwebsite irgendwie umzuleiten?

Quantumtremor
quelle
Sie können es Flasche mit Apache verwenden .
Syed Habib M
3
Der Titel der Frage passt nicht zur Frage. Vielleicht sollte es lauten, wie man andere Dinge nicht auf Port 80 zum Laufen bringt. Ich bin neugierig, wie man die Portflasche ändert, auf der diese Frage gestellt wird, aber es wird nie erwähnt, wie es hier geht
Elliot Woods

Antworten:

76

Es wird also diese Fehlermeldung ausgegeben, weil Sie apache2auf Port 80 ausgeführt haben.

Wenn dies für die Entwicklung ist, würde ich es einfach so lassen, wie es auf Port 5000 ist.

Wenn es entweder für die Produktion ist:

Nicht empfohlen

  • Halte apache2zuerst an;

Nicht empfohlen, wie in der Dokumentation angegeben:

Sie können den integrierten Server während der Entwicklung verwenden, sollten jedoch eine vollständige Bereitstellungsoption für Produktionsanwendungen verwenden. (Verwenden Sie den integrierten Entwicklungsserver nicht in der Produktion.)

Empfohlen

  • Proxy- HTTPVerkehr bis apache2zu Flask.

Auf diese Weise apache2können Sie 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 und diese Anforderungen an Flask weiterleiten.

Hier ist ein Link zur offiziellen Dokumentation zum Einrichten von Flask mit Apache + mod_wsgi.

Bearbeiten 1 - Klarstellung für @Djack

Proxy-HTTP-Verkehr zu Flask über Apache2

Wenn eine Anfrage an Port 80 ( HTTP) oder Port 443 ( HTTPS) an den Server geht, verarbeitet ein Webserver wie Apache oder Nginx die Verbindung der Anfrage und ermittelt, was damit zu tun ist. In unserem Fall sollte eine empfangene Anforderung so konfiguriert werden, dass sie im 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 optimiert, um HTTPS-Anforderungen mit nur wenig Konfiguration zu verarbeiten. Rollen Sie in Python nicht "Ihre eigenen", 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!
  • Behandlung statischer Dateien - Der integrierte Flask-Webserver kann statische Dateien verarbeiten. Dies wird jedoch nicht empfohlen. Nginx / Apache können statische Dateien wie Bilder, CSS und Javascript-Dateien viel effizienter verarbeiten und übergeben nur "dynamische" Anforderungen (solche, bei denen der Inhalt häufig aus einer Datenbank gelesen wird oder sich der Inhalt ändert), die vom Python-Code verarbeitet werden sollen.
  • + mehr. Dies grenzt an den Spielraum für diese Frage. Wenn Sie weitere Informationen wünschen, recherchieren Sie in diesem Bereich.
Ewan
quelle
Das ist in der Tat eine großartige Antwort! Können Sie den hochtechnischen Jargon, den Sie " Proxy HTTP traffic to Flask through apache2" und " reverse proxy for dynamic content" verwendet haben, im Klartext entmystifizieren ?
John Strood
2
@Djack - aktualisierte Antwort, die jedoch an den Umfang der Frage grenzt. Bitte suchen Sie online nach weiteren Informationen.
Ewan
1
Vielen Dank für die Angabe der Schlüsselwörter. Ich werde sicher eine Online-Suche machen.
John Strood
419

1- Stoppen Sie andere Anwendungen, die Port 80 verwenden. 2- Führen Sie die Anwendung mit Port 80 aus:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
quelle
1
funktioniert gut, nur in Windows-Umgebung., wenn Apache fehlt .. :)
Jose
1
Es funktioniert nicht für mich. es sollte sein: Kolbenlauf --host = 0.0.0.0
Harun-Ur-Rashid
1
@jOSe Ich habe versucht, PyCharm unter Ubuntu zu verwenden, funktioniert einwandfrei.
Bugs Buggy
@jOSe Apache wird für die Ausführung von Linux nicht benötigt. Sie können es deinstallieren oder den Port ändern.
Nurettin
145

Für extern sichtbare Server, auf denen Sie keinen Apache oder einen anderen Webserver verwenden, geben Sie einfach ein

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
quelle
Kann dieser Befehl mit env vars ausgeführt werden? Ich versuche es immer wieder CMD flask run --host=0.0.0.0 --port=$PORTin meiner Docker-Datei (aus Heroku-Gründen) und bekomme immer wieder Fehler, wenn ich eine Ganzzahl für meinen Port benötige
Smokin Joe
Dies funktionierte gut auf meinem lokalen (Laptop), aber als ich es auf meiner AWS EC2-Instanz verwendete, stand dort "Berechtigung verweigert". Wenn ich am Anfang "sudo" hinzufüge, wird der Befehl "flask" nicht erkannt ...
user3768495
1
@ user3768495 Möglicherweise ist der Kolben nicht im Root-Benutzer (sudo) installiert
Harun-Ur-Rashid
2
Hallo @ Harun-Ur-Rashid, das ist wahrscheinlich der Fall - ich habe es in einer virtuellen Umgebung installiert. Ich werde herausfinden, wie das Problem behoben werden kann. Danke für deine Antwort.
user3768495
22

Wenn Sie den Port oder Host wie folgt ändern:

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

Verwenden Sie den folgenden Code, um den Server zu starten (mein Haupteingang für die Flasche ist app.py):

python app.py

anstatt zu verwenden:

flask run
Schleim
quelle
10

Wenn Sie möchten, dass sich Ihre Anwendung auf demselben Port befindet, dh Port = 5000, führen Sie diesen Befehl einfach in Ihrem Terminal aus:

fuser -k 5000/tcp

und dann ausführen:

python app.py

Wenn Sie auf einem bestimmten Port ausgeführt werden möchten, z. B. wenn Sie auf Port = 80 ausführen möchten, erwähnen Sie in Ihrer Hauptdatei Folgendes:

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

Ein praktischer Weg ist die Verwendung des Pakets python-dotenv: Es liest eine .flaskenvDatei vor, in der Sie Umgebungsvariablen für den Kolben speichern können.

  • pip install python-dotenv
  • Erstellen Sie eine Datei .flaskenvim Stammverzeichnis Ihrer App

In der von Ihnen angegebenen Datei:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Danach müssen Sie nur noch Ihre App ausführen flask runund können an diesem Port auf Ihre App zugreifen.

Bitte beachten Sie, dass FLASK_RUN_HOSTstandardmäßig 127.0.0.1und FLASK_RUN_PORTstandardmäßig 5000.

jorop
quelle
8

Dies ist die einzige Lösung, die unter Ubuntu-18 für mich funktioniert hat.

app.pyVerwenden Sie in der Datei :

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

Der obige Code gibt den gleichen Berechtigungsfehler aus, es sudosei denn, er wird zum Ausführen verwendet:

sudo python3 app.py
Ibrahim
quelle
6

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 tun /etc/init.d/apache2 stop, anstatt sie einfach zu töten.

  2. Stellen Sie Ihre Flask-App in Ihrem Apache-Prozess bereit, wie in Flache in Apache beschrieben.

Sebastian
quelle
5

Ich musste FLASK_RUN_PORTin meiner Umgebung die angegebene Portnummer einstellen . Beim nächsten Start Ihrer App lädt Flask diese Umgebungsvariable mit der von Ihnen ausgewählten Portnummer.

Cathal Cronin
quelle
3

Sie müssen die Portnummer für Ihre Anwendung nicht ändern. Konfigurieren Sie einfach Ihren WWW-Server (Nginx oder Apache) für Proxy-Abfragen zum Flask-Port. Achten Sie darauf uWSGI.

greg
quelle
3

Setzen Sie den Port mit app.run(port=80,debug=True) Sie sollten debug auf true setzen, wenn auf dev

Valentinstag
quelle
2

Einfachste und beste Lösung

Speichern Sie Ihre .py-Datei in einem Ordner. In diesem Fall ist mein Ordnername test. Führen Sie an 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:8000 . Vielen Dank

Jagannath Banerjee
quelle
Er muss es auf 80 laufen lassen, was ein spezieller Port ist. Er muss zuerst andere Sachen stoppen.
Ahmedn1
1

In meinem Szenario haben die folgenden Schritte wie ein Zauber gewirkt:

  • Paket installieren:

    pip install --upgrade pip
    pip install python-dotenv
  • Erstellen einer versteckten Datei in meinem App-Verzeichnis "flaskr / .flaskenv"

  • Hinzufügen des folgenden Inhalts:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Führen Sie zum Schluss den Kolbenbefehl noch einmal aus:

    flask run
  • Die Version, an der ich arbeite, ist:

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