Jak sprawić, by Flask działał na porcie 80?

212

Mam serwer Flask działający przez port 5000 i jest w porządku. Mogę uzyskać do niego dostęp pod adresem http://example.com:5000

Ale czy można po prostu uzyskać do niego dostęp na stronie http://example.com ? Zakładam, że oznacza to, że muszę zmienić port z 5000 na 80. Ale kiedy spróbuję tego na Flask, pojawia się ten komunikat o błędzie po uruchomieniu.

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

Bieganie lsof -i :80powraca

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)

Czy najpierw muszę zabić te procesy? Czy to jest bezpieczne? A może jest inny sposób, aby Flask działał na porcie 5000, ale domena strony głównej jakoś przekierowała?

drżenie kwantowe
źródło
możesz użyć kolby z apache .
Syed Habib M
3
tytuł pytania nie pasuje do pytania. może powinien przeczytać „jak nie uruchamiać innych rzeczy na porcie 80”. jestem ciekawy, jak zmienić port, na którym działa kolba, o co pyta to pytanie, ale nigdy nie wspomniano tutaj, jak to zrobić
Elliot Woods,

Odpowiedzi:

76

Wyrzuca ten komunikat o błędzie, ponieważ masz apache2port 80.

Jeśli jest to do opracowania, zostawiłbym to tak, jak jest na porcie 5000.

Jeśli jest do produkcji:

Niepolecane

  • Zatrzymaj się apache2pierwszy;

Niezalecane, jak stwierdzono w dokumentacji:

Możesz używać wbudowanego serwera podczas programowania, ale powinieneś użyć opcji pełnego wdrożenia dla aplikacji produkcyjnych. (Nie używaj wbudowanego serwera programistycznego podczas produkcji).

Zalecana

  • HTTPRuch proxy przez apache2Flask.

W ten sposób apache2może obsłużyć wszystkie pliki statyczne (w których jest bardzo dobry - znacznie lepiej niż serwer debugowania wbudowany w Flask) i działać jako odwrotne proxy dla zawartości dynamicznej, przekazując te żądania do Flask.

Oto link do oficjalnej dokumentacji dotyczącej konfigurowania Flask za pomocą Apache + mod_wsgi.

Edycja 1 - Wyjaśnienie @Djack

Ruch proxy proxy do Flask przez apache2

Kiedy żądanie przychodzi do serwera na porcie 80 ( HTTP) lub porcie 443 ( HTTPS), serwer WWW, taki jak Apache lub Nginx, obsługuje połączenie żądania i określa, co z nim zrobić. W naszym przypadku otrzymane żądanie należy skonfigurować tak, aby było przekazywane do Flask na protokole WSGI i obsługiwane przez kod Pythona. To jest część „dynamiczna”.

odwrotny serwer proxy dla treści dynamicznych

Konfigurowanie serwera WWW ma kilka zalet, jak wyżej;

  • Zakończenie SSL - serwer WWW zostanie zoptymalizowany do obsługi żądań HTTPS przy niewielkiej konfiguracji. Nie twórz własnych w Pythonie, co jest prawdopodobnie bardzo niepewne w porównaniu.
  • Bezpieczeństwo - Otwarcie portu do Internetu wymaga starannego rozważenia bezpieczeństwa. Serwer programistyczny Flask nie jest do tego przeznaczony i może mieć otwarte błędy lub problemy z bezpieczeństwem w porównaniu z serwerem WWW zaprojektowanym do tego celu. Pamiętaj, że źle skonfigurowany serwer WWW może być również niepewny!
  • Obsługa plików statycznych - wbudowany serwer internetowy Flask może obsługiwać pliki statyczne, jednak nie jest to zalecane; Nginx / Apache są znacznie bardziej wydajne w obsłudze plików statycznych, takich jak obrazy, CSS, pliki JavaScript i będą przekazywać tylko „dynamiczne” żądania (te, w których zawartość jest często odczytywana z bazy danych lub zmian treści), które są obsługiwane przez kod Pythona.
  • + więcej. To granice zakresu tego pytania. Jeśli chcesz uzyskać więcej informacji, zrób trochę badań w tej dziedzinie.
Ewan
źródło
To naprawdę świetna odpowiedź! Czy potrafisz odszyfrować w prostym języku angielskim wysoce techniczny żargon, którego użyłeś „ Proxy HTTP traffic to Flask through apache2” i „ reverse proxy for dynamic content”?
John Strood,
2
@Djack - zaktualizowana odpowiedź, jednak graniczy z zakresem pytania, więc wyszukaj online więcej informacji.
Ewan
1
Dziękujemy za podanie słów kluczowych. Z pewnością przeprowadzę wyszukiwanie online.
John Strood,
419

1- Zatrzymaj inne aplikacje korzystające z portu 80. 2- Uruchom aplikację z portem 80:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
źródło
1
działa dobrze, tylko w środowisku Windows., gdy nie ma apache .. :)
jOSe
1
to nie działa dla mnie. powinno być: uruchomienie kolby - host = 0.0.0.0
Harun-Ur-Rashid
1
@jOSe Próbowałem używać PyCharm na Ubuntu, działa dobrze.
Bugs Buggy,
@jOSe Apache nie jest potrzebny do uruchomienia Linuksa, możesz go odinstalować lub zmienić port.
nurettin
145

W przypadku serwera widocznego z zewnątrz, na którym nie używasz apache lub innego serwera WWW, który po prostu wpisujesz

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
źródło
Czy to polecenie można uruchomić przy użyciu zmiennych env? CMD flask run --host=0.0.0.0 --port=$PORTWciąż próbuję w moim Dockerfile (z powodów heroku) i ciągle pojawiają się błędy związane z potrzebą liczby całkowitej dla mojego portu
Smokin Joe
Działa to dobrze na moim lokalnym (laptopie), ale kiedy użyłem go na mojej instancji AWS EC2, pojawia się komunikat „Odmowa zezwolenia”. Jeśli dodam „sudo” na początku, polecenie „flask” nie zostanie rozpoznane ...
użytkownik3768495
1
@ user3768495 Może kolba nie jest zainstalowana u użytkownika root (sudo)
Harun-Ur-Rashid
2
Cześć @ Harun-Ur-Rashid, prawdopodobnie tak jest - zainstalowałem go w środowisku wirtualnym. Sprawdzę, jak to naprawić. Dzięki za odpowiedź.
user3768495
22

Jeśli użyjesz następujących opcji, aby zmienić port lub host:

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

użyj następującego kodu, aby uruchomić serwer (moje główne wejście do skrzynki to app.py):

python app.py

zamiast używać:

flask run
muca
źródło
10

Jeśli chcesz, aby Twoja aplikacja korzystała z tego samego portu, tj. Portu = 5000, uruchom tylko to polecenie w swoim terminalu:

fuser -k 5000/tcp

a następnie uruchom:

python app.py

Jeśli chcesz uruchomić na określonym porcie, np. Jeśli chcesz uruchomić na porcie = 80, w głównym pliku po prostu wspomnij o tym:

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)
Alok Singh
źródło
8

Wygodnym sposobem jest użycie pakietu python-dotenv: odczytuje .flaskenvplik, w którym można przechowywać zmienne środowiskowe dla kolby.

  • pip install python-dotenv
  • utwórz plik .flaskenvw katalogu głównym aplikacji

Wewnątrz pliku określasz:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Następnie wystarczy uruchomić aplikację flask run i uzyskać dostęp do aplikacji na tym porcie.

Należy pamiętać, że FLASK_RUN_HOSTdomyślne 127.0.0.1i FLASK_RUN_PORTdomyślne 5000.

jorop
źródło
8

To jedyne rozwiązanie, które działało dla mnie na Ubuntu-18.

W pliku app.pyużyj:

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

Powyższy kod da ten sam błąd uprawnień, chyba że sudozostanie użyty do uruchomienia:

sudo python3 app.py
Ibrahim
źródło
6

Problem polega na tym, że masz już uruchomiony serwer Apache, który już korzysta z portu 80. Możesz więc:

  1. Kill apache: Prawdopodobnie powinieneś to zrobić poprzez /etc/init.d/apache2 stop, zamiast po prostu ich zabijać.

  2. Wdróż aplikację flask w procesie apache, jak opisuje flask w apache .

sebastian
źródło
5

Musiałem ustawić FLASK_RUN_PORTw moim środowisku określony numer portu. Następnym razem, gdy uruchomisz aplikację, Flask załaduje tę zmienną środowiskową z wybranym numerem portu.

Cathal Cronin
źródło
3

Nie musisz zmieniać numeru portu dla swojej aplikacji, wystarczy skonfigurować serwer www (nginx lub apache) do zapytań proxy do portu flask. Zwróć uwagę na uWSGI.

greg
źródło
3

ustaw port, przy app.run(port=80,debug=True) którym powinieneś ustawić debugowanie na true, gdy używasz dev

cicha sympatia
źródło
2

Najłatwiejsze i najlepsze rozwiązanie

Zapisz plik .py w folderze. W tym przypadku nazwa mojego folderu to test. W wierszu polecenia uruchom następujące polecenie

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

----------------- Następujące zostaną zwrócone ----------------

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

Teraz w przeglądarce wpisz: http://127.0.0.1:8000 . Dzięki

Jagannath Banerjee
źródło
Musi uruchomić go na 80, który jest specjalnym portem. Najpierw musi zatrzymać inne rzeczy.
Ahmedn1
1

W moim scenariuszu następujące kroki działały jak urok:

  • Instalowanie pakietu:

    pip install --upgrade pip
    pip install python-dotenv
  • Tworzenie ukrytego pliku w moim katalogu aplikacji „flaskr / .flaskenv”

  • Dodanie następującej treści:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Na koniec jeszcze raz uruchom komendę flask:

    flask run
  • Wersja, nad którą pracuję, to:

    pip freeze |grep -i flask
    Flask==1.1.1
Manuel Lazo
źródło