Nginx es conocido por su alto rendimiento, estabilidad, funciones ricas, configuración simple y bajo consumo de recursos. ¡Este artículo comprende por qué Nginx es tan rápido!
Modelo de proceso de Nginx
Servidor Nginx, durante el funcionamiento normal:
-
Procesos múltiples : un proceso maestro, múltiples procesos de trabajo.
-
Proceso maestro: gestiona el proceso del trabajador. Interfaz externa: recepción de operaciones externas (señales); reenvío interno: de acuerdo con diferentes operaciones externas, administrar Worker a través de señales; monitoreo: monitorear el estado de ejecución del proceso Worker y reiniciar automáticamente el proceso Worker después de que finalice de manera anormal.
-
Proceso de trabajo: Todos los procesos de trabajo son iguales. Procesamiento real: las solicitudes de red son procesadas por el proceso de trabajador. Número de proceso de trabajo : configurado en nginx.conf, generalmente establecido en el número de núcleos para hacer un uso completo de los recursos de la CPU. Al mismo tiempo, evite un número excesivo de procesos, evite la competencia por los recursos de la CPU y aumente la pérdida de cambio de contexto.
Establecimiento de conexión HTTP y procesamiento de solicitudes
El proceso de establecimiento de conexión HTTP y procesamiento de solicitudes es el siguiente:
-
Cuando se inicia Nginx, el proceso maestro carga el archivo de configuración.
-
El proceso Master inicializa el conector de escucha.
-
Proceso maestro, Fork produce múltiples procesos de trabajo.
-
El proceso Worker compite por una nueva conexión, y el ganador establece una conexión Socket mediante un protocolo de enlace de tres vías y procesa la solicitud.
Nginx alto rendimiento, alta concurrencia
¿Por qué Nginx tiene un alto rendimiento y puede admitir una alta concurrencia?
-
Nginx usa multiproceso + modo asíncrono sin bloqueo (multiplexación IO Epoll).
-
El proceso completo de la solicitud: establecer una conexión → leer la solicitud → resolver la solicitud → procesar la solicitud → responder a la solicitud.
-
El proceso de solicitud completo corresponde a la capa inferior: leer y escribir eventos de Socket.
Modelo de procesamiento de eventos de Nginx
Solicitud: solicitud HTTP en Nginx.
Modo de trabajo básico del servidor web HTTP:
-
Recepción de solicitud: lea la línea de solicitud y el encabezado de solicitud línea por línea. Después de juzgar que el segmento tiene un cuerpo de solicitud, lea el cuerpo de solicitud.
-
Procese la solicitud.
-
Devolver respuesta: Genere la solicitud HTTP correspondiente (línea de respuesta, encabezado de respuesta, cuerpo de respuesta) de acuerdo con el resultado del procesamiento.
Nginx también es esta rutina, el proceso general es el mismo:
Arquitectura modular
Los módulos de Nginx se pueden dividir básicamente en los siguientes tipos según sus funciones:
① módulo de eventos: crea un marco para un mecanismo de procesamiento de eventos independiente del sistema operativo y proporciona el procesamiento de eventos específicos. Incluyendo ngx_events_module, ngx_event_core_module y ngx_epoll_module, etc.
El módulo de procesamiento de eventos que utiliza Nginx depende del sistema operativo específico y las opciones de compilación.
② Controlador de fase: este tipo de módulo también se denomina directamente módulo controlador. Es principalmente responsable de procesar las solicitudes del cliente y generar contenido para responder, como el módulo ngx_http_static_module, que es responsable de procesar la solicitud de página estática del cliente y preparar el archivo de disco correspondiente como salida del contenido de la respuesta.
③ filtro de salida: también conocido como módulo de filtro, que es el principal responsable de procesar el contenido de salida y puede modificar la salida.
Por ejemplo, puede implementar tareas como agregar una barra de pie predefinida a todas las páginas html de salida o reemplazar la URL de la imagen de salida.
④ upstream: el módulo upstream realiza la función de proxy inverso, reenvía la solicitud real al servidor back-end, lee la respuesta del servidor back-end y la envía de vuelta al cliente.
El módulo ascendente es un controlador especial, pero el contenido de la respuesta no se genera realmente por sí mismo, sino que se lee desde el servidor de fondo.
⑤load-balancer: módulo de equilibrio de carga, que implementa un algoritmo específico. Entre los muchos servidores back-end, seleccione un servidor como servidor de reenvío para una determinada solicitud.
Análisis de problemas comunes
Nginx vs Apache
Nginx:
-
Multiplexación IO, Epoll (kqueue en freebsd)
-
alto rendimiento
-
Alta concurrencia
-
Ocupa menos recursos del sistema
Apache:
-
Bloqueo + multiproceso / multiproceso
-
Más estable, menos errores
-
Más módulos
Escenas:
Al procesar varias solicitudes, puede utilizar:
IO 多路复用
o阻塞 IO
+多线程
1. Multiplexación de E / S :
一个
线程
rastrea el estado de múltiples sockets, cualquiera que就绪
sea leído y escrito;2. Bloqueo de IO + multiproceso : para cada solicitud, cree un nuevo subproceso de servicio
Pensando : ¿ IO 多路复用
y 多线程
la escena aplicable?
IO 多路复用
: La velocidad de procesamiento de solicitudes de una sola conexión no tiene ninguna ventaja, adecuada para escenarios de IO intensivos , impulsada por eventos
-
Gran concurrencia : solo se usa un hilo para procesar una gran cantidad de solicitudes concurrentes, lo que reduce la pérdida de cambio de contexto , y no hay necesidad de considerar problemas de concurrencia, y se pueden procesar relativamente más solicitudes;
-
Consume menos recursos del sistema (no es necesario
线程调度开销
) -
Aplicable a
长连接
la situación (el modo multiproceso es长连接
fácil de causar线程过多
, causar频繁调度
)
阻塞IO + 多线程
: Implementación simple, sin necesidad de depender de llamadas al sistema, adecuado para escenarios con uso intensivo de CPU
-
Cada hilo necesita tiempo y espacio;
-
Cuando aumenta el número de subprocesos, la sobrecarga de programación de subprocesos aumenta exponencialmente
Número máximo de conexiones de Nginx
Antecedentes básicos:
-
Nginx es un modelo multiproceso y el proceso Worker se utiliza para procesar solicitudes.
-
El número de conexiones para un solo proceso (descriptor de archivo fd) tiene un límite superior (nofile): ulimit -n.
-
Configure el número máximo de conexiones para un solo proceso de trabajo en Nginx: el límite superior de worker_connections es nofile.
-
Configure el número de procesos de trabajo en Nginx: worker_processes.
Por lo tanto, el número máximo de conexiones para Nginx:
-
El número máximo de conexiones para Nginx: el número de procesos de trabajo x el número máximo de conexiones para un solo proceso de trabajo.
-
Lo anterior es el número máximo de conexiones cuando Nginx se usa como servidor general.
-
Cuando se utiliza Nginx como servidor proxy inverso, el número máximo de conexiones que se pueden atender: (número de procesos de trabajo x número máximo de conexiones para un solo proceso de trabajo) / 2.
-
Cuando Nginx reverse proxy, establecerá la conexión del Cliente y la conexión del servidor web backend, ocupando 2 conexiones.
Capacidades de procesamiento concurrente de Nginx
Con respecto a la capacidad de procesamiento concurrente de Nginx: el número de conexiones concurrentes, después de la optimización general, el valor pico se puede mantener en aproximadamente 1 ~ 3w. (Los números de núcleo de memoria y CPU son diferentes, habrá espacio para una mayor optimización).