it-swarm.it

Come posso ottenere Flask per funzionare sulla porta 80?

Ho un server Flask che funziona attraverso la porta 5000, e va bene. Posso accedervi da http://example.com:5000

Ma è possibile accedervi semplicemente in http://example.com ? Suppongo che questo significhi che devo cambiare la porta da 5000 a 80. Ma quando 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

Esegue lsof -i :80 restituisce 

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 mantenere Flask in esecuzione sulla porta 5000 ma il reindirizzamento del dominio del sito Web principale in qualche modo?

Grazie.

137
quantumtremor

Quindi sta lanciando quel messaggio di errore perché hai Apache2 in esecuzione sulla porta 80.

Se questo è per lo sviluppo, vorrei lasciarlo come è sulla porta 5000.

Se è per la produzione:

Non consigliato

  • Fermare prima Apache2

Non consigliato 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 HTTP traffico attraverso Apache2 to Flask.

In questo modo, Apache2 può gestire tutti i tuoi file statici (che è molto buono - molto meglio del server di debug incorporato in Flask) e agire come proxy inverso per il tuo contenuto dinamico, passando quelle richieste a Flask.

Ecco un link alla documentazione ufficiale sull'impostazione 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 risolve il problema. 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 contenuto dinamico

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 solo 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. Nota che un web server mal configurato può anche non essere sicuro! 
  • Gestione file statica - È possibile che il web server integrato Flask gestisca file statici, tuttavia ciò non è raccomandato; Nginx/Apache sono molto più efficienti nella gestione di file statici come immagini, CSS, file Javascript e passeranno solo le 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 dello scopo di questa domanda. Se vuoi maggiori informazioni, fai qualche ricerca in quest'area. 
53
Ewan

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

if __== '__main__':
      app.run(Host='0.0.0.0', port=80)
307
Amir Mofakhar

Per server visibili esternamente, dove non usi Apache o altri server web che digiti 

flask run --Host=0.0.0.0 --port=80
84
Harun-Ur-Rashid

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

if __== '__main__':
  app.run(Host='0.0.0.0', port=80)

usa il seguente codice per avviare il server (il mio ingresso principale per il pallone è app.py):

python app.py

invece di usare:

flask run
7
muca

Il tuo problema è che hai già un server web Apache che sta già usando la porta 80. Quindi, puoi:

  1. Kill Apache: probabilmente dovresti farlo tramite /etc/init.d/Apache2 stop, piuttosto che semplicemente ucciderli.

  2. Distribuisci la tua app per flask nel tuo processo di Apache, come flask in Apache descrive.

6
sebastian

Se vuoi la tua applicazione sulla stessa porta i.e port = 5000, allora nel tuo terminale esegui questo comando:

fuser -k 5000/tcp

e quindi eseguire:

python app.py

Se desideri eseguire una porta specificata, ad es. se vuoi correre su port = 80, nel tuo file principale menziona questo:

if __== '__main__':  
    app.run(Host='0.0.0.0', port=80)
5
Alok Singh

Non è necessario modificare il numero di porta per la propria applicazione, basta configurare il server www (nginx o Apache) alle query proxy alla porta flask. Paga attantion su uWSGI.

3
greg

imposta la porta con app.run(port=80,debug=True)è necessario impostare debug su true quando su dev

0
valentine

Ho dovuto impostare FLASK_RUN_PORT nel mio ambiente al numero di porta specificato. Quando ho avviato l'app, ha rilevato la porta che volevo.

0
cathaldcronin1