Cómo entender la relación entre Nginx, uWSGI y Flask
En resumen, desde que envía una solicitud HTTP hasta que Flask procesa la solicitud, el cliente pasa por tres niveles: la capa del servidor web, la capa WSGI y la capa del marco web. Diferentes capas tienen diferentes funciones. Las funciones de cada capa se presentan brevemente a continuación.
Figura 1: La relación de tres capas entre el servidor web, el marco web y WSGI
Capa de servidor web
Para la arquitectura tradicional cliente-servidor, la solicitud El proceso de procesamiento es que el cliente envía una solicitud al servidor, el servidor recibe la solicitud, la procesa y luego devuelve una respuesta al cliente. En este proceso, la función del servidor es:
Recibir solicitudes
Procesar solicitudes
Devolver respuestas
Los servidores web son un tipo de La función del servidor es principalmente recibir solicitudes HTTP y devolver respuestas. Todo el mundo está familiarizado con los servidores web. Los servidores web comunes incluyen Nginx, Apache, IIS, etc. En la estructura de tres niveles de la Figura 1 anterior, el servidor web es el primero en recibir las solicitudes de los usuarios y devolver los resultados de las respuestas al usuario.
Capa de marco web
La función principal del marco web es facilitar el desarrollo de aplicaciones web. Los datos dinámicos de las solicitudes HTTP los proporciona la capa de marco web. Los marcos web comunes incluyen Flask, Django, etc. Tomamos el marco Flask como ejemplo para mostrar la función del marco web:
Python
from flask import Flask
app = Flask(__name__)
@app.route('/hola')
def hello_world():
return '¡Hola mundo! '
if __name__ == '__main__':
app.run(host='0.0.0.0', puerto=8080)
1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello_world(): p>
return '¡Hola mundo!'
if __name__ == '__main__':
app.run(host='0.0.0.0', puerto=8080)
Las simples líneas de código anteriores crean una aplicación de objeto de aplicación web. La aplicación escucha el puerto 8080
de todas las direcciones IP de la máquina y acepta solicitudes de conexión de los usuarios. Sabemos que el protocolo HTTP utiliza URL para localizar recursos. El programa anterior entregará la solicitud de la ruta /hola al método hello_world
y hello_world devuelve la cadena '¡Hola mundo!'. A los usuarios de frameworks web, no les importa cómo recibir solicitudes HTTP
, ni cómo enrutar las solicitudes a métodos específicos para procesarlas y devolver los resultados de la respuesta al usuario. En la mayoría de los casos, los usuarios de marcos web solo deben preocuparse por cómo implementar la lógica empresarial.
Capa WSGI
WSGI no es un servidor, ni es una API para interactuar con programas, ni es código real. WSGI es solo una interfaz, y solo se aplica al. Lenguaje Python. El nombre completo es
Web Server Gateway Interface, que define la especificación de la interfaz entre servidores web y aplicaciones web. En otras palabras, siempre que el servidor web y la aplicación web cumplan con el protocolo WSGI, el servidor web y la aplicación web se pueden combinar a voluntad.
El siguiente código muestra cómo se combina el servidor web con la aplicación web
Python
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hola mundo"]
1
2
3
def aplicación(env, start_response):
start_response('200 OK', [('Tipo de contenido ', 'text/html')])
return [b"Hello World"]
El servidor web llama a la aplicación del método y se implementan y pasan los parámetros env y start_response ingresado por el servidor web. Entre ellos,
env es un diccionario que incluye variables de entorno como HTTPHOST, HOSTUSERAGENT, SERVERPROTOCO, etc.
start_response es un método que acepta dos parámetros, a saber, estado y encabezados de respuesta.
La función principal del método de aplicación es establecer el código de estado y la información del encabezado del tipo de contenido de la respuesta http y devolver los resultados específicos de la respuesta.
El código anterior es una aplicación WSGI completa. Cuando un servidor web que admite WSGI recibe la solicitud del cliente, llamará al método de esta aplicación
. La capa WSGI no necesita preocuparse por cómo se implementan las dos variables env y start_response. Simplemente use estas dos variables directamente, tal como se hace en la aplicación
.
Vale la pena señalar que WSGI es un protocolo y es necesario distinguir varios términos similares:
uwsgi: al igual que wsgi, también es un protocolo y el servidor uWSGI utiliza Protocolo uwsgi
uWSGI: servidor web que implementa los protocolos uwsgi y WSGI. Tenga en cuenta que uWSGI es esencialmente un servidor web, ubicado en la capa del servidor web en la estructura de tres niveles descrita anteriormente.
CGI: Common Gateway Interface, no limitado al lenguaje Python, define cómo el servidor web proporciona contenido dinámico al cliente. Por ejemplo, especifica cómo el cliente pasa parámetros al servidor web, cómo el servidor web pasa parámetros a la aplicación web, cómo la aplicación web envía su salida al cliente, etc.
Las aplicaciones web en entornos de producción ya no utilizan CGI. El proceso CGI (similar al intérprete de Python) se crea para cada solicitud y se descarta después de su uso, lo cual es ineficiente.
WSGI surgió como reemplazo del CGI.
Hablando de esto, básicamente hemos aclarado el papel de WSGI entre el servidor web y el marco web: WSGI es como un enlace que conecta el servidor web al
marco web. Volviendo al título de este artículo, Nginx es un servidor web y Flask es un marco web. Por lo tanto, las funciones de WSGI, Nginx y Flask son evidentes.
Conversación entre Nginx, WSGI y Flask
Nginx: Hola, WSGI, acabo de recibir una solicitud. Necesito que hagas algunos preparativos y luego Flask se encargará de la solicitud. .
WSGI: Bueno, Nginx. Configuraré las variables de entorno y luego pasaré la solicitud a Flask para su procesamiento.
Flask: ¡Gracias WSGI! Dame algo de tiempo y te enviaré la respuesta.
WSGI: Muy bien, entonces te espero.
Flask: Bien, ya terminé. Aquí está el resultado de la respuesta de la solicitud. La solicitud pasa el resultado a Nginx. WSGI: ¡Buen trabajo!
Nginx, aquí está el resultado de la respuesta, que se le ha devuelto según sea necesario.
Nginx: Genial, lo recibí y devolví el resultado de la respuesta al cliente. Feliz cooperación con todos ~