¿Cómo consigo que Flask se ejecute en el puerto 80?

212

Tengo un servidor Flask que se ejecuta a través del puerto 5000, y está bien. Puedo acceder a él en http://example.com:5000

¿Pero es posible acceder a él simplemente en http://example.com ? Supongo que eso significa que tengo que cambiar el puerto de 5000 a 80. Pero cuando lo intento en Flask, recibo este mensaje de error cuando lo ejecuto.

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

Ejecutando lsof -i :80devoluciones

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)

¿Necesito matar estos procesos primero? ¿Eso es seguro? ¿O hay otra forma de mantener Flask ejecutándose en el puerto 5000 pero hacer que el dominio del sitio web principal se redirija de alguna manera?

temblor cuántico
fuente
puedes usarlo frasco con apache .
Syed Habib M
3
El título de la pregunta no se ajusta a la pregunta. quizás debería leer 'cómo no hacer que otras cosas se ejecuten en el puerto 80'. Tengo curiosidad por saber cómo se está ejecutando el matraz de puertos, que es lo que esta pregunta pregunta, pero nunca se menciona cómo hacerlo aquí
Elliot Woods

Respuestas:

76

Entonces arroja ese mensaje de error porque se está apache2ejecutando en el puerto 80.

Si esto es para el desarrollo, lo dejaría como está en el puerto 5000.

Si es para producción tampoco:

No recomendado

  • Detente apache2primero;

No recomendado como se indica en la documentación:

Puede usar el servidor incorporado durante el desarrollo, pero debe usar una opción de implementación completa para las aplicaciones de producción. (No utilice el servidor de desarrollo integrado en producción).

Recomendado

  • HTTPTráfico proxy a través apache2de Flask.

De esta manera, apache2puede manejar todos sus archivos estáticos (lo cual es muy bueno, mucho mejor que el servidor de depuración integrado en Flask) y actuar como un proxy inverso para su contenido dinámico, pasando esas solicitudes a Flask.

Aquí hay un enlace a la documentación oficial sobre la configuración de Flask con Apache + mod_wsgi.

Edición 1 - Aclaración para @Djack

Tráfico proxy HTTP a Flask a través de apache2

Cuando una solicitud llega al servidor en el puerto 80 ( HTTP) o en el puerto 443 ( HTTPS), un servidor web como Apache o Nginx maneja la conexión de la solicitud y determina qué hacer con ella. En nuestro caso, una solicitud recibida debe configurarse para que se pase a Flask en el protocolo WSGI y se maneje con el código Python. Esta es la parte "dinámica".

proxy inverso para contenido dinámico

Existen algunas ventajas para configurar su servidor web como las anteriores;

  • Terminación SSL: el servidor web estará optimizado para manejar solicitudes HTTPS con solo una pequeña configuración. No "enrolle el suyo" en Python, que probablemente sea muy inseguro en comparación.
  • Seguridad: abrir un puerto a Internet requiere una cuidadosa consideración de la seguridad. El servidor de desarrollo de Flask no está diseñado para esto y podría tener errores abiertos o problemas de seguridad en comparación con un servidor web diseñado para este propósito. Tenga en cuenta que un servidor web mal configurado también puede ser inseguro.
  • Manejo de archivos estáticos: es posible que el servidor web incorporado Flask maneje archivos estáticos; sin embargo, esto no es recomendable; Nginx / Apache son mucho más eficientes en el manejo de archivos estáticos como imágenes, CSS, archivos Javascript y solo pasarán solicitudes "dinámicas" (aquellas en las que el contenido a menudo se lee desde una base de datos o los cambios de contenido) para ser manejados por el código Python.
  • + más Esto limita con el alcance de esta pregunta. Si desea más información, investigue un poco en esta área.
Ewan
fuente
¡Esa es una gran respuesta! ¿Puedes desmitificar en inglés la jerga altamente técnica que usaste " Proxy HTTP traffic to Flask through apache2" y " reverse proxy for dynamic content"?
John Strood
2
@Djack: respuesta actualizada, sin embargo, está al borde del alcance de la pregunta, así que realice una búsqueda en línea para obtener más información.
Ewan
1
Gracias por proporcionar las palabras clave. Seguramente haré una búsqueda en línea.
John Strood
419

1- Detenga otras aplicaciones que estén utilizando el puerto 80. 2- ejecute la aplicación con el puerto 80:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
fuente
1
funciona bien, solo en el entorno de Windows., cuando Apache está ausente .. :)
jOSe
1
No está funcionando para mi. debería ser: matraz --host = 0.0.0.0
Harun-Ur-Rashid
1
@jOSe Intenté usar PyCharm en Ubuntu, funciona bien.
Bugs Buggy
@jOSe Apache no es necesario para que Linux se ejecute, puede desinstalarlo o cambiar su puerto.
nurettin
145

Para el servidor visible externamente, donde no usa apache u otro servidor web, simplemente escribe

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
fuente
¿Se puede ejecutar este comando utilizando env vars? Sigo intentando CMD flask run --host=0.0.0.0 --port=$PORTen mi Dockerfile (por razones de heroku) y sigo recibiendo errores sobre la necesidad de un número entero para mi puerto
Smokin Joe
Esto funcionó bien en mi local (computadora portátil) pero cuando lo usé en mi instancia de AWS EC2, dice "Permiso denegado". Si agrego "sudo" al principio, el comando dice "matraz" no se reconoce ...
user3768495
1
@ user3768495 Quizás el matraz no está instalado en el usuario root (sudo)
Harun-Ur-Rashid
2
Hola @ Harun-Ur-Rashid, ese es probablemente el caso: lo instalé en un entorno virtual. Veré cómo solucionarlo. Gracias por su respuesta.
user3768495
22

Si usa lo siguiente para cambiar el puerto o el host:

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

use el siguiente código para iniciar el servidor (mi entrada principal para el matraz es app.py):

python app.py

En lugar de usar:

flask run
muca
fuente
10

Si desea que su aplicación esté en el mismo puerto, es decir, puerto = 5000, solo en su terminal ejecute este comando:

fuser -k 5000/tcp

y luego ejecuta:

python app.py

Si desea ejecutar en un puerto especificado, por ejemplo, si desea ejecutar en el puerto = 80, en su archivo principal solo mencione esto:

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

Una forma conveniente es usar el paquete python-dotenv: lee un .flaskenvarchivo donde puede almacenar variables de entorno para el matraz.

  • pip install python-dotenv
  • crear un archivo .flaskenven el directorio raíz de su aplicación

Dentro del archivo que especifique:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Después de eso solo tienes que ejecutar tu aplicación con flask run y puede acceder a su aplicación en ese puerto.

Tenga en cuenta que los FLASK_RUN_HOSTvalores predeterminados 127.0.0.1y FLASK_RUN_PORTpredeterminados son 5000.

jorop
fuente
8

Esta es la única solución que funcionó para mí en Ubuntu-18.

Dentro del archivo app.py, use:

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

El código anterior dará el mismo error de permiso a menos que sudose use para ejecutarlo:

sudo python3 app.py
Ibrahim
fuente
6

Su problema es que ya tiene un servidor web Apache en ejecución que ya está utilizando el puerto 80. Entonces, puede:

  1. Matar apache: probablemente deberías hacer esto a través de /etc/init.d/apache2 stop, en lugar de simplemente matarlos.

  2. Implemente su aplicación de matraz en su proceso de apache, como se describe en el matraz de apache .

sebastian
fuente
5

Tuve que establecer FLASK_RUN_PORTen mi entorno el número de puerto especificado. La próxima vez que inicie su aplicación, Flask cargará esa variable de entorno con el número de puerto que seleccionó.

Cathal Cronin
fuente
3

No necesita cambiar el número de puerto para su aplicación, solo configure su servidor www (nginx o apache) para consultas proxy al puerto de matraz. Prestar atención en uWSGI.

Greg
fuente
3

establecer el puerto con app.run(port=80,debug=True) usted debe establecer la depuración en verdadero cuando en dev

enamorado
fuente
2

La solución más fácil y mejor

Guarde su archivo .py en una carpeta. Este caso el nombre de mi carpeta es prueba. En el símbolo del sistema, ejecute lo siguiente

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

----------------- Lo siguiente será devuelto ----------------

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

Ahora en su navegador escriba: http://127.0.0.1:8000 . Gracias

Jagannath Banerjee
fuente
Necesita ejecutarlo en 80, que es un puerto especial. Necesita detener otras cosas primero.
Ahmedn1
1

En mi escenario, los siguientes pasos funcionaron de maravilla:

  • Instalando el paquete:

    pip install --upgrade pip
    pip install python-dotenv
  • Crear un archivo oculto en mi directorio de aplicaciones "flaskr / .flaskenv"

  • Agregando el siguiente contenido:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Finalmente, ejecute el comando del matraz una vez más:

    flask run
  • La versión en la que estoy trabajando es:

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