Apache Prefork vs Worker MPM

113

Mirando el archivo de configuración de Apache, veo Prefork y Worker MPM definidos. ¿Cuál es la diferencia y cuál está usando Apache?

Cory
fuente

Respuestas:

120

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

Arvind
fuente
11
Consulte también "¿Cómo selecciono qué Apache MPM usar?" serverfault.com/a/383634
Nazariy
@arvind // Cada hilo maneja una conexión a la vez // ¿Aquí conexión significa usuario único o solicitud única? por favor explique
user1844933
21

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=NAMEcon el script de configuración donde NAMEestá 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_winntse usa de manera predeterminada). Aquí está la lista de sistemas operativos y sus MPM predeterminados:

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 disponibles
  • mpm_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ándar
  • mpm_netware Módulo de multiprocesamiento que implementa un servidor web con subprocesos exclusivos optimizado para Novell NetWare
  • mpmt_os2 MPM híbrido multiproceso y multiproceso para OS / 2
  • prefork Implementa un servidor web pre-bifurcado sin subprocesos
  • mpm_winnt - Este módulo de multiprocesamiento está optimizado para Windows NT.
  • worker - Módulo multiproceso que implementa un servidor web multiproceso multiproceso híbrido

Ahora, a la diferencia entre preforky worker.

El preforkMPM

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 workerMPM 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).

usuario2314737
fuente
1
Una instalación predeterminada de ubuntu-trusty-64 de apache 2.4.7 está utilizando el evento MPM
Federico
9

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.

hd1
fuente
3
¿Qué pasa con Event MPM?
Vince Kronlein
6

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
Jeffmcneill
fuente
3

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

Rimu Atkinson
fuente
8
Apache se puede compilar con ambos módulos MPM, por lo que esto no siempre es confiable. Si enumera dos módulos MPM, intente apachectl -Vmirar la salida junto a Server MPM. También puede comprobar ps auxy buscar httpdo httpd.worker.
reflexiv
2
En mi caso apache2ctl -lno funcionó; tuvo que usar apachectl -l.
Vacilando
2
ninguno de ellos está en la lista para mí, pero apache funciona bien, Apache / 2.4.7 (Ubuntu)
karatedog
2
En centos 7.x que ejecuta apache 2.4.6, httpd -Vdará algo como:Server MPM: worker
runamok
2

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
Harsimranjit Singh Kler
fuente
¿Por qué cuando intenté usar mpm_worker o mpm_event, no funciona mi página?
Leoh
0

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.

Rahul Chaubey
fuente