run digitalocean deploy python nginx flask uwsgi buildout

python - digitalocean - ¿Se requiere un servidor WSGI y un servidor HTTP para servir una aplicación Flask?



nginx gunicorn flask (2)

Configurar Flask con uWSGI y Nginx es bastante difícil, e incluso con los scripts de construcción lleva bastante tiempo, y tiene que registrarse en las instrucciones para reproducirse más tarde.

Si no planeo una gran carga en el servidor (está oculto para el público), ¿tiene sentido ejecutarlo sin uWSGI? (Flask puede escuchar un puerto. ¿Puede Nginx simplemente reenviar solicitudes?)

¿Tiene sentido no usar incluso Nginx, solo ejecutar la aplicación de matraz desnudo en un puerto?


Cuando "ejecuta Flask", en realidad está ejecutando el servidor WSGI de desarrollo de Werkzeug y está pasando su aplicación Flask como el WSGI invocable.

El servidor de desarrollo no está diseñado para su uso en producción. No está diseñado para ser particularmente eficiente, estable o seguro.

Reemplace el servidor de desarrollo de Werkzeug con un servidor WSGI listo para producción como Gunicorn o uWSGI cuando pase a producción, sin importar dónde esté disponible la aplicación.

La respuesta es similar para "debería usar un servidor web". Los servidores WSGI tienen servidores HTTP, pero no serán tan buenos como un servidor HTTP de producción dedicado (Nginx, Apache, etc.).

Flask documents cómo implementar de varias maneras. Muchos proveedores de alojamiento también tienen documentación sobre la implementación de Python o Flask.


Presumiblemente ya tiene un objeto de aplicación Flask y rutas configuradas, pero si crea la aplicación de esta manera:

import flask app = flask.Flask(__name__)

luego configure su @app.route() s, y luego cuando quiera iniciar la aplicación:

import gevent app_server = gevent.wsgi.WSGIServer((host, port), app) app_server.serve_forever()

Luego, puede ejecutar su aplicación directamente en lugar de tener que decirle a gunicorn o uWSGI o cualquier otra cosa que la ejecute por usted.

Tuve un caso en el que quería que la utilidad del matraz creara una aplicación web (un servicio REST API) y descubrí que la incapacidad de componer el matraz con otros elementos que no son del matraz ni del servicio web es un problema. Finalmente encontré gevent.wsgi.WSGIServer y era justo lo que necesitaba. Después de la llamada a app_server.serve_forever() , puede llamar a app_server.stop() cuando su aplicación quiera salir.

En mi implementación, mi aplicación está escuchando en localhost: usando matraz y gevent, y luego tengo nginx solicitudes HTTPS de proxy inverso en otro puerto y las reenvío a mi servicio de matraz en localhost.