worker - Servidor HTTP Apache

Apache Server 2.0

<-

MPM de Apache worker

Esta traducción podría estar obsoleta. Consulte la versión en inglés de la documentación para comprobar si se han producido cambios recientemente.
Descripción:Módulo de MultiProcesamiento que implementa un servidor web híbrido multihebra-multiproceso
Estado:MPM
Identificador de Módulos:mpm_worker_module
Fichero de Código Fuente:worker.c

Resumen de contenidos

Este Módulo de MultiProcesamiento (MPM) implementa un servidor híbrido multiproceso-multihebra. Usando hebras para atender peticiones, el servidor puede servir un mayor número de peticiones con menos recursos de sistema que un servidor basado únicamente en procesos. No obtante, se mantiene casi por completo la estabilidad de un servidor basado en procesos manteniendo la capacidad multiproceso, pudiendo cada proceso tener muchas hebras.

Las directivas más importantes que se usan para controlar este MPM son ThreadsPerChild, que controla el número de hebras que tiene cada proceso hijo y MaxClients, que controla el número máximo de hebras que pueden crearse.

top

Cómo funciona

Un solo proceso de control (el padre) es el responsable de crear los procesos hijo. Cada proceso hijo crea un número fijo de hebras del servidor de la forma que se especifica en la directiva ThreadsPerChild, así como una hebra de escucha que escuchará si se producen peticiones y las pasará a una hebra del servidor para que la procese.

Apache siempre intenta mantener en reserva cierto número de hebras de sobra o en espera, que están preparadas para servir peticiones en el momento en que lleguen. Así, los clientes no tienen que esperar a que se creen nuevas hebras o procesos para que sean atendidas sus peticiones. El número de procesos que se crean al principio está determinado por la directiva StartServers. Después durante el funcionamiento del servidor, Apache calcula el número total de hebras en espera entre todos los procesos, y crea o elimina procesos para mantener ese número dentro de los límites especificados en las directivas MinSpareThreads y MaxSpareThreads. Como este proceso está bastante autorregulado, no es muy habitual que sea necesario modificar los valores que estas directivas traen por defecto. El número máximo de clientes que pueden ser servidos simultáneamente (por ejemplo, el número máximo de hebras entre todos los procesos) está determinado por la directiva MaxClients. El número máximo de procesos hijo activos está determinado por el valor especificado en la directiva MaxClients dividido por el valor especificado en la directiva ThreadsPerChild.

Hay dos directivas que establecen límites estrictos al número de procesos hijo activos y al número de hebras del servidor en un proceso hijo, y puede cambiarse solo parando completamente el servidor y volviendo a iniciarlo. La directiva ServerLimit marca el límite estricto de procesos hijo activos posibles, y debe ser mayor o igual al valor de la directiva MaxClients dividido por el valor de la directiva ThreadsPerChild. El valor de la directiva ThreadLimit es el límite estricto del número de hebras del servidor, y debe ser mayor o igual al valor de la directiva ThreadsPerChild. Si los valores de esas directivas no son los que vienen por defecto, deben aparecer antes que el resto de directivas del módulo worker.

Además del conjunto de procesos hijo activos, puede haber otros procesos hijo que están terminando pero en los que al menos una hebra del servidor está todavía tratando una conexión con un cliente. Puede haber hasta MaxClients procesos terminando, aunque el número real de estos procesos que puede esperarse es mucho menor. Este comportamiento puede evitarse desactivando la eliminación individual de procesos hijo, lo que se hace de la siguiente manera:

Una configuración típica del sistema de control de procesos y hebras del módulo de MPM worker prodría ser como sigue:

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

Mientras que el proceso padre se inicia con privilegios de usuario root en Unix para usar el puerto de escucha 80, los procesos hijo y las hebras se inician con menores privilegios de usuario. Las directivas User y Group se usan para determinar los privilegios con los que se iniciarán los procesos hijo. Los procesos hijo deben ser capaces de leer los contenidos que van a servir, pero solo los permisos extrictamente necesarios para cumplir su tarea. Además. a menos que se use suexec, los privilegios fijados en estas directivas son los que que van a heredar los scripts CGI.

La directiva MaxRequestsPerChild controla con qué frecuencia el servidor recicla los procesos eliminando los antiguos y creando nuevos.