¿Por qué la ejecución de Flask con Nginx requiere un contenedor WSGI?

Entonces, desde los documentos de Python / Flask, ambos recomiendan no ejecutar el servidor web de Flask como el servidor web de producción, lo que tiene sentido. Mi pregunta es, ¿puedo ejecutar mi aplicación Flask sobre un servidor Nginx? ¿Por qué todas las guías en Internet recomiendan envolver a Flask alrededor de uWSGI, Tornado o algún otro servidor WSGI? ¿Qué significa que algo sea WSGI? ¿No es compatible Flask WGSI?

Estoy particularmente perdido porque aquí , la primera respuesta dice:

Apache y Nginx son servidores HTTP. Pueden servir archivos estáticos como (archivos .jpg y .html) o páginas dinámicas (como un blog o foro de WordPress escrito en un idioma como PHP o Python).

Sin embargo esta publicación dice:

Nginx es un servidor web. Sirve archivos estáticos, sin embargo, no puede ejecutar y alojar aplicaciones Python. uWSGI llena ese vacío.

Parece ineficiente que mi aplicación sea manejada por un servidor (por ejemplo, uWSGI) y luego por otro servidor (por ejemplo: Nginx).

Nginx es un servidor web y se ocupa de las cosas del servidor web, no de cómo ejecutar progtwigs de Python. uWSGI es un servidor de aplicaciones y sabe cómo hablar WSGI con Python (y otros idiomas ahora). Tanto Nginx como uWSGI hablan el protocolo uWSGI, que es un protocolo eficiente sobre sockets UNIX.

Nginx se ocupa de las solicitudes http desde / respuestas al mundo exterior (posiblemente balanceo de carga, almacenamiento en caché, etc.). Su aplicación Flask se ocupa de las solicitudes / respuestas WSGI. uWSGI sabe cómo iniciar su aplicación (posiblemente con multiproceso y / o subprocesos) y cerrar la brecha entre HTTP y WSGI.

Hay otros servidores HTTP además de Nginx, y otros servidores WSGI además de uWSGI, pero todos usan el mismo flujo de trabajo: el servidor HTTP pasa al servidor WSGI, que administra el proceso de su aplicación y vuelve al servidor HTTP.

Esta configuración se conoce como un proxy inverso . Permite que cada herramienta haga lo que es bueno y no se preocupe por las otras partes del proceso. No hay nada particularmente ineficiente al respecto, hasta que se llega a escalas realmente masivas .

Bueno, WSGI es una especificación para la interfaz entre las aplicaciones de Python y los servidores web. uWSGI es (en pocas palabras) una realización de esta especificación escrita en C / C ++. Puede ejecutar casi cualquier aplicación en un servidor web “serio” (como nginx) simplemente proporcionando un punto de entrada:

def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["Hello World"] 

y luego ejecutarlo de esta manera:

 uwsgi --http :9090 --wsgi-file file_with_the_code_above.py 

Puedes devolver lo que quieras en lugar de [“Hola mundo”], por supuesto. Consulte http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html para obtener más información.