Come faccio a far funzionare Flask sulla porta 80?


212

Ho un server Flask in esecuzione attraverso la porta 5000, e va bene. Posso accedervi all'indirizzo http://example.com:5000

Ma è possibile accedervi semplicemente su http://example.com ? Suppongo che ciò significhi che devo cambiare la porta da 5000 a 80. Ma quando lo provo su Flask, ricevo questo messaggio di errore quando lo eseguo.

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

In esecuzione lsof -i :80 rendimenti

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)

Devo prima uccidere questi processi? È sicuro? O c'è un altro modo per far funzionare Flask sulla porta 5000 ma il reindirizzamento del dominio del sito Web principale in qualche modo?


puoi usarlo con l'apache .
Syed Habib M,

3
il titolo della domanda non corrisponde alla domanda. forse dovrebbe leggere "come non far funzionare altre cose sulla porta 80". sono curioso di sapere come cambiare la beuta del porto su cui si sta ponendo questa domanda, ma non è mai stato menzionato come fare qui
Elliot Woods,

Risposte:


76

Quindi sta lanciando quel messaggio di errore perché è in apache2esecuzione sulla porta 80.

Se questo è per lo sviluppo, lo lascerei semplicemente come è sulla porta 5000.

Se è anche per la produzione:

Non consigliato

  • Fermati apache2prima;

Non raccomandato come indicato nella documentazione:

È possibile utilizzare il server integrato durante lo sviluppo, ma è necessario utilizzare un'opzione di distribuzione completa per le applicazioni di produzione. (Non utilizzare il server di sviluppo integrato in produzione.)

Consigliato

  • Proxy HTTPtraffic through apache2to Flask.

In questo modo, è in apache2grado di gestire tutti i tuoi file statici (cosa di cui è molto bravo - molto meglio del server di debug integrato in Flask) e di fungere da proxy inverso per il tuo contenuto dinamico, passando quelle richieste a Flask.

Ecco un link alla documentazione ufficiale sulla configurazione di Flask con Apache + mod_wsgi.

Modifica 1 - Chiarimento per @Djack

Proxy HTTP traffic to Flask through apache2

Quando una richiesta arriva al server sulla porta 80 ( HTTP) o sulla porta 443 ( HTTPS) un server web come Apache o Nginx gestisce la connessione della richiesta e scopre cosa farne. Nel nostro caso una richiesta ricevuta dovrebbe essere configurata per essere passata a Flask sul protocollo WSGI e gestita dal codice Python. Questa è la parte "dinamica".

proxy inverso per contenuti dinamici

Ci sono alcuni vantaggi nella configurazione del tuo server web come sopra;

  • Terminazione SSL: il server Web sarà ottimizzato per gestire le richieste HTTPS con una piccola configurazione. Non "rollare il tuo" in Python che è probabilmente molto insicuro in confronto.
  • Sicurezza: l'apertura di una porta su Internet richiede un'attenta valutazione della sicurezza. Il server di sviluppo di Flask non è progettato per questo e potrebbe avere bug aperti o problemi di sicurezza rispetto a un server web progettato per questo scopo. Si noti che anche un server Web configurato in modo errato può essere insicuro!
  • Gestione statica dei file - È possibile che il server web Flask integrato gestisca i file statici, ma ciò non è raccomandato; Nginx / Apache sono molto più efficienti nella gestione di file statici come immagini, CSS, Javascript e passano solo richieste "dinamiche" (quelle in cui il contenuto viene spesso letto da un database o le modifiche del contenuto) per essere gestite dal codice Python.
  • +In più. Questo è al limite dell'ambito di questa domanda. Se vuoi maggiori informazioni fai qualche ricerca in quest'area.

Questa è davvero un'ottima risposta! Riesci a demistificare in un inglese semplice il gergo altamente tecnico che hai usato " Proxy HTTP traffic to Flask through apache2" e " reverse proxy for dynamic content"?
John Strood,

2
@Djack - risposta aggiornata ma confina con l'ambito della domanda, quindi cerca online per maggiori informazioni.
Ewan,

1
Grazie per aver fornito le parole chiave. Farò sicuramente una ricerca online.
John Strood,

419

1- Arrestare altre applicazioni che utilizzano la porta 80. 2- eseguire l'applicazione con la porta 80:

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

1
funziona bene, solo in ambiente Windows., quando Apache è assente .. :)
jOSe

1
non funziona per me. dovrebbe essere: flask run --host = 0.0.0.0
Harun-Ur-Rashid

1
@jOSe Ho provato ad usare PyCharm su Ubuntu, funziona benissimo.
Bugs Buggy

@jOSe Apache non è necessario per il funzionamento di Linux, è possibile disinstallarlo o modificarne la porta.
Nurettin,

145

Per server visibili esternamente, in cui non si utilizza apache o altri server Web, è sufficiente digitare

flask run --host=0.0.0.0 --port=80

Questo comando può essere eseguito usando env vars? Continuo a provare CMD flask run --host=0.0.0.0 --port=$PORTnel mio Dockerfile (per motivi di heroku) e continuo a ricevere errori sulla necessità di un numero intero per la mia porta
Smokin Joe,

Questo ha funzionato bene sul mio locale (laptop) ma quando l'ho usato sulla mia istanza di AWS EC2, dice "Autorizzazione negata". Se aggiungo "sudo" all'inizio, il comando "pallone" non viene riconosciuto ...
user3768495

1
@ user3768495 Forse il pallone non è installato nell'utente root (sudo)
Harun-Ur-Rashid

2
Ciao @ Harun-Ur-Rashid, probabilmente è così: l'ho installato in un ambiente virtuale. Controllerò come risolverlo. Grazie per la tua risposta.
user3768495

22

Se si utilizza quanto segue per modificare la porta o l'host:

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

usare il codice seguente per avviare il server (la mia entrata principale per flask è app.py):

python app.py

invece di usare:

flask run

10

Se vuoi che la tua applicazione sia sulla stessa porta, cioè port = 5000, allora nel tuo terminale esegui questo comando:

fuser -k 5000/tcp

e poi esegui:

python app.py

Se si desidera eseguire su una porta specificata, ad esempio se si desidera eseguire su port = 80, nel file principale è sufficiente menzionare questo:

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

8

Un modo conveniente è usare il pacchetto python-dotenv: legge un .flaskenvfile in cui è possibile memorizzare variabili d'ambiente per pallone.

  • pip install python-dotenv
  • crea un file .flaskenvnella directory principale della tua app

All'interno del file si specifica:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Dopodiché devi solo eseguire la tua app flask run e puoi accedere alla tua app su quella porta.

Si noti che per FLASK_RUN_HOSTimpostazione predefinita 127.0.0.1e per FLASK_RUN_PORTimpostazione predefinita 5000.


8

Questa è l'unica soluzione che ha funzionato per me su Ubuntu-18.

All'interno del file app.py, utilizzare:

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

Il codice sopra darà lo stesso errore di autorizzazione a meno che non sudovenga usato per eseguirlo:

sudo python3 app.py

6

Il tuo problema è che hai già un webserver apache che sta già utilizzando la porta 80. Quindi, puoi:

  1. Uccidi apache: probabilmente dovresti farlo tramite /etc/init.d/apache2 stop, piuttosto che semplicemente ucciderli.

  2. Distribuisci l'app di pallone nel processo di apache, come descritto nel pallone di apache .


5

Ho dovuto impostare FLASK_RUN_PORTnel mio ambiente il numero di porta specificato. Al prossimo avvio dell'app, Flask caricherà la variabile di ambiente con il numero di porta selezionato.


3

Non è necessario modificare il numero di porta per l'applicazione, è sufficiente configurare il server www (nginx o apache) per eseguire query proxy su porta matraccio. Paga l'attantion su uWSGI.


3

impostare la porta con app.run(port=80,debug=True) te dovrebbe impostare il debug su true quando su dev


2

La soluzione più semplice e migliore

Salva il tuo file .py in una cartella. In questo caso il nome della mia cartella è test. Nel prompt dei comandi eseguire quanto segue

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

----------------- Verrà restituito quanto segue ----------------

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

Ora sul tuo browser digita: http://127.0.0.1:8000 . Grazie


Deve eseguirlo su 80, che è una porta speciale. Deve prima fermare altre cose.
Ahmedn1,

1

Nel mio scenario i seguenti passaggi hanno funzionato come un incantesimo:

  • Installazione del pacchetto:

    pip install --upgrade pip
    pip install python-dotenv
  • Creazione di un file nascosto nella directory della mia app "flaskr / .flaskenv"

  • Aggiunta del seguente contenuto:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Infine, esegui il comando flask ancora una volta:

    flask run
  • La versione su cui sto lavorando è:

    pip freeze |grep -i flask
    Flask==1.1.1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.