Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo implementar la red Python

Cómo implementar la red Python

Cualquiera que haya estudiado PHP sabe que el entorno formal para la implementación de PHP es muy simple. Simplemente cambie algunos archivos y estará bien. Usar FastCgi también es cuestión de minutos. En comparación, la implementación de Python en aplicaciones web es mucho más complicada. La razón principal es que existe una amplia variedad de herramientas y soporte insuficiente por parte de los servidores convencionales. Antes de comprender cómo implementar Python en un entorno de producción, primero comprenda algunos conceptos. ¡Muy importante!

CGI:

CGI, Common Gateway Interface, es un estándar de interfaz entre aplicaciones externas (programas CGI) y servidores web. Un protocolo para transferir información entre servidores. La especificación CGI permite que un servidor web ejecute un programa externo y envíe su salida a un navegador web. CGI convierte un conjunto simple de documentos web hipermedia estáticos en un nuevo medio interactivo. En términos sencillos, CGI es como un puente que conecta las páginas web con el programa de ejecución en el servidor WEB. Pasa las instrucciones recibidas por HTML al programa de ejecución en el servidor y luego devuelve los resultados del programa de ejecución del servidor al HTML. página. El rendimiento multiplataforma de CGI es excelente y puede implementarse en casi cualquier sistema operativo.

El método CGI comienza con una solicitud de conexión (solicitud de usuario), crea un proceso hijo de cgi, activa el proceso CGI, luego maneja la solicitud y finaliza el proceso hijo después del procesamiento. Este es el modelo de ejecución de la bifurcación. Por lo tanto, un servidor que utiliza el método cgi tendrá tantos subprocesos cgi como solicitudes de conexión, y la carga repetida de subprocesos es la razón principal del bajo rendimiento de cgi. Cuando la cantidad de solicitudes de los usuarios es muy grande, ocupará muchos recursos del sistema, como memoria, tiempo de CPU, etc., lo que provocará un rendimiento deficiente.

Flujo de trabajo de script CGI:

El navegador solicita una URL desde la aplicación CGI a través de un formulario HTML o un hipervínculo.

El servidor ejecutor recibe y envía solicitudes. Aplicación CGI especificada.

Las aplicaciones CGI normalmente realizan las acciones deseadas en función de las entradas del espectador.

Las aplicaciones CGI dan formato a los resultados en un documento (normalmente una página HTML) que los servidores web y los navegadores pueden entender.

El servidor web devuelve los resultados al navegador.

Python tiene un módulo cgi para admitir programas cgi locales

FastCGI:

FastCGI es una interfaz extensible de alta velocidad para servidores HTTP y comunicación entre lenguajes de secuencias de comandos dinámicos . FastCGI, una mejora evolutiva sobre CGI, es compatible con los servidores HTTP más populares (incluidos Apache, Nginx y lighttpd) y muchos lenguajes de secuencias de comandos (incluido Python). La principal desventaja del enfoque tradicional de la interfaz CGI es el bajo rendimiento, porque cada vez que el servidor HTTP encuentra un programa dinámico, necesita reiniciar el analizador de secuencias de comandos para analizarlo y luego devolver los resultados al servidor HTTP. fastCGI es como un CGI de larga duración que se puede ejecutar siempre que esté activado sin perder tiempo bifurcándose cada vez (este es el modo de ejecución de bifurcación más criticado de CGI). Cgi se conoce como aplicación de corta duración, mientras que fastCGI se conoce como aplicación de larga duración. CGI se conoce como aplicación de corta duración, mientras que FastCGI se conoce como aplicación de larga duración. Debido a que los programas FastCGI no necesitan generar nuevos procesos constantemente, la presión sobre el servidor se puede reducir considerablemente y se pueden producir aplicaciones más eficientes. Es al menos 5 veces más rápida y eficiente que la tecnología CGI.

También admite computación distribuida, lo que significa que los programas FastCGI pueden ejecutarse en hosts distintos del servidor web y recibir solicitudes de otros servidores web.

FastCGI es una extensión abierta e independiente del lenguaje para CGI con una arquitectura extensible cuyo comportamiento principal es mantener el proceso del intérprete CGI en la memoria, logrando así un mayor rendimiento. Como todos sabemos, la carga repetida del intérprete CGI es la razón principal del bajo rendimiento de CGI. Si el intérprete CGI permanece en la memoria y acepta la programación del administrador de procesos FastCGI, puede proporcionar buen rendimiento, escalabilidad, funcionalidad de conmutación por error, etc. . La interfaz FastCGI adopta una estructura C/S, que puede separar el servidor HTTP y el servidor de análisis de scripts. La interfaz FastCGI adopta una estructura C/S, que separa el servidor HTTP del servidor de análisis de scripts e inicia uno o más demonios de análisis de scripts en el servidor de análisis de scripts. Cuando el servidor HTTP encuentra un programa dinámico, puede pasarlo directamente al proceso FastCGI para su ejecución y luego devolver los resultados al navegador. Este enfoque permite que el servidor HTTP maneje exclusivamente solicitudes estáticas o devuelva resultados desde un servidor de script dinámico al cliente, lo que mejora en gran medida el rendimiento general de la aplicación.

Flujo de trabajo FastCGI:

El servidor web se inicia cargando el administrador de procesos FastCGI (PHP-CGI o PHP-FPM o spawn-cgi).

El administrador de procesos FastCGI se inicializa, inicia múltiples procesos de interpretación CGI (visibles como múltiples php-cgi) y espera la llegada de nuevas solicitudes.

Cuando la solicitud de un cliente llega al servidor web, el administrador de procesos FastCGI selecciona y se conecta al intérprete CGI, y el servidor web envía las variables de entorno CGI y la entrada estándar al proceso hijo FastCGI php-cgi.

Una vez que el subproceso FastCGI completa el procesamiento, devuelve la salida estándar y la información de error al servidor web desde la misma conexión. Cuando el proceso secundario FastCGI cierra la conexión, la solicitud se ha procesado y el proceso secundario FastCGI espera y maneja la siguiente conexión desde el administrador de procesos FastCGI (que se ejecuta en el servidor web). En modo CGI, php-cgi sale aquí.

Características de FastCGI:

Rompe la tecnología tradicional de procesamiento de páginas. En la tecnología de procesamiento de páginas tradicional, el programa debe estar en el mismo servidor que el servidor web o el servidor de aplicaciones. Esta historia se ha roto con la tecnología FastCGI. Las aplicaciones de tecnología FastCGI se pueden instalar en cualquier servidor del grupo de servidores y comunicarse con el servidor web a través del protocolo TCP/IP. También es adecuado para desarrollar grupos web distribuidos a gran escala. control eficiente de la base de datos.

Modo de solicitud explícita. La tecnología CGI no tiene roles claros, pero se le asignan roles claros en los programas FastCGI (rol de respondedor, rol de autenticador, rol de filtro).

WSGI:

La interfaz de puerta de enlace del servidor web Python (WSGI para abreviar) es una interfaz simple y común entre un servidor web y una aplicación web o marco de lenguaje Python. Desde el desarrollo de WSGI, han aparecido interfaces similares en muchos otros idiomas. WSGI está diseñado como la interfaz de bajo nivel entre un servidor web y una aplicación web o marco de aplicación para mejorar la similitud del desarrollo de aplicaciones web portátiles. WSGI se basa en el estándar CGI existente.

WSGI se divide en dos partes: el "servidor" o "gateway" y la "aplicación" o "marco de aplicación". Al procesar una solicitud WSGI, el servidor proporciona a la aplicación un contexto ambiental y funciones de devolución de llamada. Cuando la aplicación termina de procesar la solicitud, pasa los resultados al servidor a través de la función de devolución de llamada anterior. El llamado middleware WSGI implementa ambos extremos de la interfaz de la aplicación y, por lo tanto, desempeña un papel intermediario entre el servicio WSGI y la aplicación WSGI: desde la perspectiva del servidor WSGI, el middleware desempeña el papel de la aplicación, y desde la perspectiva de la aplicación Desde una perspectiva, el middleware actúa como un servidor. El componente "middleware" realiza las siguientes funciones:

Rutas solicitan información a diferentes objetos de la aplicación según la URL de destino después de anular las variables de entorno.

Permite la ejecución simultánea en un solo proceso Múltiples aplicaciones o marcos de aplicaciones

Equilibrio de carga y comunicación remota mediante el reenvío de mensajes de solicitud y respuesta a través de la red

Postprocesamiento de contenido, como la aplicación de hojas de estilo XSLT. Anteriormente, elegir el marco de aplicación web adecuado se convertía en un problema difícil para los principiantes en Python porque, en general, la elección del marco de aplicación web limitaría la elección de servidores web disponibles y viceversa para Python en ese momento. Las aplicaciones generalmente están diseñadas para CGI, FastCGI, mod_python, o incluso una de las interfaces API personalizadas para un servidor web específico. WSGI es un contenedor CGI para Python y Fastcgi es un contenedor CGI para PHP.

Los componentes web WSGI se dividen en tres categorías: Web. servidor, middleware web, aplicación web: WSGI server-gt; (middleware WSGI)*-gt;

uwsgi:

El protocolo uwsgi es el protocolo propio del servidor uWSGI. para definir el tipo de información transmitida. Los primeros 4 bytes de cada paquete de datos uwsgi se utilizan para describir el tipo de información transmitida. En comparación con WSGI, se dice que es 10 veces más eficiente que fcgi. , consulte: protocolo uwsgi

¡Los cuatro puntos anteriores pueden entenderse como un protocolo! Al ejecutar dicho protocolo, puede implementarlo con servicios web y aplicaciones web relacionadas.

uWSGI:

El proyecto uWSGI tiene como objetivo desarrollar una solución completa para implementar aplicaciones web en redes distribuidas y sus servicios estándar, y se ha utilizado con éxito en muchos lenguajes diferentes debido a la arquitectura extensible de uWSGI. , se puede ampliar sin límite para admitir más plataformas y lenguajes. Actualmente, puede usar complementos de escritura C, C++ y Objective-C. El "WSGI" en el nombre del proyecto es un guiño al estándar web Python. uWSGI es un servidor web que implementa el protocolo WSGI, uwsgi, http y otros protocolos >

Las características principales de uWSGI son las siguientes:

Rendimiento ultrarrápido

Baja huella de memoria (aproximadamente la mitad del mod_wsgi de apache2).

Gestión de múltiples aplicaciones.

Capacidades de registro detalladas (se pueden utilizar para analizar el rendimiento de las aplicaciones y los cuellos de botella).

Altamente personalizable (límite de tamaño de memoria, reinicio después de usar un número determinado de servicios, etc.).

Gunicorn:

Una herramienta similar a uWSGi, portada desde la herramienta de implementación de rieles (Unicorn).

Pero el protocolo que utiliza es el WSGI antes mencionado, que es un estándar oficial definido en Python 2.5 (¿PEP 333?), tiene raíces rojas, es relativamente sencillo de implementar y puede encontrar un tutorial detallado sobre cómo usarlo aquí. Gunicorn utiliza el modelo prefork. El servidor Gunicorn es compatible con una variedad de marcos de red, tiene una ejecución muy simple, un consumo ligero de recursos y es bastante rápido. Presenta una estrecha integración con Django y es particularmente fácil de implementar. También hay muchas deficiencias: no es compatible con HTTP 1.1, el rendimiento del acceso concurrente no es alto y existe una cierta brecha de rendimiento con uWSGI, Gevent, etc.

1. Diseño de Gunicorn

Gunicorn es un servidor web que tiene un proceso principal que genera múltiples procesos de trabajo. El proceso principal controla la creación y terminación de procesos de trabajo, y los procesos de trabajo solo necesitan aceptar solicitudes y procesarlas. Esta separación facilita la recarga del código y aumenta o disminuye la cantidad de procesos de trabajo. El autor le da al proceso de trabajo mucho espacio de expansión para admitir diferentes métodos de IO, como Gevent, Sync, Asyc, Eventlet, etc. La separación completa de los procesos principales y de trabajo hace que Gunicorn sea esencialmente un servicio que controla los procesos.

2. Estructura del código fuente de Gunicorn

A partir de Application.run(), primero inicializamos la configuración, leemos la configuración del archivo, leemos la configuración del terminal, etc. para completar la configuración. Arbiter es esencialmente el núcleo del proceso principal. Primero lee y establece la configuración de la clase de configuración, luego inicializa el controlador de señales y crea el socket, luego genera procesos de trabajo de acuerdo con el número configurado de procesos de trabajo y luego ingresa al sondeo. estado, es decir, recibir la señal, procesar la señal y seguir adelante. El método para activar el proceso aquí es crear una PIPE, escribir en la tubería a través del controlador de señales y luego el proceso principal se activa a través de select.select().

Después de despertarse, el proceso de trabajo se inicializa, luego hace lo mismo con la señal y comienza a sondear, procesar solicitudes HTTP, llamar a la aplicación WSGI y obtener respuestas. Luego continúa corriendo.

La ventaja del proceso de sincronización Sync es que cada solicitud está aislada y el error de cada solicitud no afectará a otras solicitudes, pero esto puede provocar cuellos de botella en el rendimiento.

Tornado:

Aunque Tornado es un marco de desarrollo de Python, es un servidor http asíncrono, sin bloqueo y no sigue ninguno de los protocolos comunes anteriores porque es una Web en sí misma. servidor, por lo que las solicitudes dinámicas generarán el contenido dinámico solicitado por el usuario directamente a través de mecanismos internos. Si lo está utilizando como servidor independiente y desea implementarlo con otros marcos como Flask, necesitará utilizar el protocolo WSGI, que está integrado en Tornado, el tornado.wsgi.WSGIContainer.

wsgiiref:

Python viene con implementación WSGI, es decir, servidor wsgi. Un servidor WSGI puede entenderse como un servidor web que cumple con el estándar WSGI. Recibe una solicitud, encapsula un conjunto de variables de entorno, llama a una aplicación WSGI registrada de acuerdo con la especificación WSGI y finalmente devuelve una respuesta al cliente.

¡Todo lo anterior puede entenderse como implementación! ¡lograr! ¡lograr! ¡Herramientas para implementar el acuerdo!

Nota: mod_wsgi (módulo de Apache) es en realidad un módulo que implementa el protocolo wsgi. Casi no está abandonado ahora, así que no diré más si está interesado, puede echar un vistazo.

Entonces, si usa el marco Django para desarrollar una aplicación y desea implementarla en un entorno de producción, definitivamente no puede usar el que viene con Django. Puede usar el servidor uWSGI que usa uwsgi. protocolo, o puede usar Gunicorn o Tornado que implementa el protocolo WSGI, también puede usar los servidores Nginx, lighttpd y apache en modo FastCGI y CGI. ¡También se pueden utilizar otros marcos! Una vez que comprenda estos conceptos, podrá tener una idea clara al implementar y "sabrá qué está sucediendo y por qué" cuando trabaje con varias herramientas.

En los proyectos de nuestro equipo, hay dos frameworks, Django y Tornado, y también se utilizan dos métodos de implementación en el entorno de producción: uWSGI y Gunicorn:

El proyecto Django usa Nginx uWSGI implementación, el proyecto Tornado usa Nginx Gunicorn para la implementación:

Nginx uWSGI, el proyecto Tornado usa Nginx Gunicorn para la implementación:

Nginx se usa como herramienta de implementación, pero la implementación del El proyecto no es el mismo.