Respuestas:
Prefork y worker son dos tipos de MPM que proporciona apache. Ambos tienen sus méritos y deméritos.
Por defecto, mpm es prefork, que es seguro para subprocesos.
Prefork MPM utiliza varios procesos secundarios con un hilo cada uno y cada proceso maneja una conexión a la vez.
Worker MPM utiliza varios procesos secundarios con muchos subprocesos cada uno. Cada hilo maneja una conexión a la vez.
Para obtener más detalles, puede visitar https://httpd.apache.org/docs/2.4/mpm.html y https://httpd.apache.org/docs/2.4/mod/prefork.html
Los módulos de multiprocesamiento (MPM) de Apache son responsables de vincularse a los puertos de red en la máquina, aceptar solicitudes y enviar a los niños para manejar las solicitudes ( http://httpd.apache.org/docs/2.2/mpm.html ).
Son como cualquier otro módulo de Apache, excepto que solo se debe cargar uno y solo un MPM en el servidor en cualquier momento . Los MPM se eligen durante la configuración y se compilan en el servidor usando el argumento --with-mpm=NAME
con el script de configuración donde NAME
está el nombre del MPM deseado.
Apache usará un MPM predeterminado para cada sistema operativo a menos que se elija uno diferente en el momento de la compilación (por ejemplo, en Windows mpm_winnt
se usa de manera predeterminada). Aquí está la lista de sistemas operativos y sus MPM predeterminados:
beos
mpm_netware
mpmt_os2
prefork
( actualización para la versión de Apache ≥ 2,4 : prefork
, worker
o event
, dependiendo de las capacidades de la plataforma)mpm_winnt
Para verificar qué módulos están compilados en el servidor, use la opción de línea de comandos -l
( aquí está la documentación). Por ejemplo, en una instalación de Windows, puede obtener algo como:
> httpd -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
A partir de la versión 2.2, esta es la lista de funciones principales y módulos MPM disponibles :
core
- Funciones principales del servidor HTTP Apache que siempre están disponiblesmpm_common
- Una colección de directivas implementadas por más de un módulo de multiprocesamiento (MPM)beos
- Este módulo de multiprocesamiento está optimizado para BeOS.event
- Una variante experimental del MPM trabajador estándarmpm_netware
Módulo de multiprocesamiento que implementa un servidor web con subprocesos exclusivos optimizado para Novell NetWarempmt_os2
MPM híbrido multiproceso y multiproceso para OS / 2prefork
Implementa un servidor web pre-bifurcado sin subprocesosmpm_winnt
- Este módulo de multiprocesamiento está optimizado para Windows NT.worker
- Módulo multiproceso que implementa un servidor web multiproceso multiproceso híbridoAhora, a la diferencia entre prefork
y worker
.
El prefork
MPM
implementa un servidor web pre-bifurcado sin subprocesos que maneja las solicitudes de una manera similar a Apache 1.3. Es apropiado para sitios que necesitan evitar subprocesos para la compatibilidad con bibliotecas que no son seguras para subprocesos. También es el mejor MPM para aislar cada solicitud, de modo que un problema con una sola solicitud no afectará a ninguna otra.
El worker
MPM implementa un servidor híbrido multiproceso de múltiples subprocesos y ofrece un mejor rendimiento, por lo que debería preferirse a menos que uno esté utilizando otros módulos que contengan bibliotecas no seguras para subprocesos (consulte también esta discusión o esto en Serverfault).
Eche un vistazo a esto para obtener más detalles. Se refiere a cómo Apache maneja múltiples solicitudes. Preforking, que es el predeterminado, inicia una serie de procesos de Apache (2 de forma predeterminada aquí, aunque creo que se puede configurar esto a través de httpd.conf). Worker MPM iniciará un nuevo hilo por solicitud, lo que supongo que es más eficiente en memoria. Históricamente, Apache ha utilizado prefork, por lo que es un modelo mejor probado. El subprocesamiento solo se agregó en 2.0.
Para CentOS 6.xy 7.x (incluido Amazon Linux) utilice:
sudo httpd -V
Esto le mostrará cuáles de los MPM están configurados. Ya sea prefork, trabajador o evento. Prefork es el modelo anterior, seguro para subprocesos. Worker tiene varios subprocesos y el evento admite php-mpm, que se supone que es un mejor sistema para manejar subprocesos y solicitudes.
Sin embargo, sus resultados pueden variar según la configuración. He visto mucha inestabilidad en php-mpm y ninguna mejora de velocidad. Una araña agresiva puede agotar el máximo de procesos secundarios en php-mpm con bastante facilidad.
La configuración de prefork, worker o event se establece en sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (para CentOS 6.x / 7.x / Apache 2.4).
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so
Puede saber si Apache está usando preforma o trabajador emitiendo el siguiente comando
apache2ctl -l
En el resultado resultante, busque menciones de prefork.c o worker.c
apachectl -V
mirar la salida junto a Server MPM
. También puede comprobar ps aux
y buscar httpd
o httpd.worker
.
apache2ctl -l
no funcionó; tuvo que usar apachectl -l
.
httpd -V
dará algo como:Server MPM: worker
Es fácil cambiar entre prefork o worker mpm en Apache 2.4 en RHEL7
Verifique el tipo de MPM ejecutando
sudo httpd -V
Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built: Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Ahora para cambiar MPM, edite el siguiente archivo y descomente el MPM requerido
/etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
Apache tiene 2 tipos de MPM (módulos multiprocesamiento) definidos:
1: Prefork 2: Trabajador
De forma predeterminada, Apacke está configurado en modo pre-bifurcado, es decir, servidor web pre-bifurcado sin subprocesos. Eso significa que cada proceso secundario de Apache contiene un solo hilo y maneja una solicitud a la vez. Por eso, consume más recursos.
Apache también tiene el MPM trabajador que convierte Apache en un servidor web multiproceso y multiproceso. Worker MPM utiliza varios procesos secundarios con muchos subprocesos cada uno.