Skip to content

Apache 2.4 con MPM Event, conexiones rechazadas

mpm-event-mpm-prefork
mpm-event-mpm-prefork

Hace pocos días que empecé a probar en un entorno real el MPM Event de Apache 2.4 con PHP-FPM.

La configuración por defecto de Apache nunca está pensada para entornos de producción, siempre hay que hacer ajustes. Apache está pensado para “auto-limitarse”, tanto en el número de conexiones, como la ram, etc.. de modo que “nunca” colapsará el servidor. La idea e responder tantas peticiones como sea posible sin utilizar absolutamente todos los recursos del servidor. Así puede convivir con otros sistemas como mysql, php-fpm,…

La idea está bien pero eso requiere de ajustes en cada servidor para que apache utilice todos los recursos que sean posibles, a fin de responder todas las peticiones posibles.

Tras dos días de pruebas, no funciona del todo bien. El problema es que rechaza algunas conexiones.  Aparte de esto, todo funciona bien.

En este servidor tengo unos 350.000 hits por hora. Y rechaza unas 130 conexiones cada hora (de media, aveces más a veces menos, pero nunca 0).

Las conexiones rechazadas fueron aleatorias, nunca es sobre la misma dirección o el mismo tipo de fichero, ya puede ser peticiones a php, jpg, html… es indiferente.

Realicé múltiples ajustes en la configuración de MPM Event, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<IfModule mpm_worker_module>
# event MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves

ServerLimit 1024
StartServers 8
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxClients 1025
MaxRequestsPerChild 0
</IfModule>

Hice de todo, subir todos los valores a “lo loco”, ajustándolo según la documentación, etc.. el resultado siempre fue el mismo. No puedo ni decir en que punto mejoró o empeoró. Después de cada cambio le daba unos 30 minutos de control para ver que pasaba, y hacía siempre lo mismo.

En el caso de MPM Prefork tengo la siguiente configuración, que funciona perfectamente:

1
2
3
4
5
6
7
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 20
MaxClients 250
MaxRequestsPerChild 0
</IfModule>

Se supone que MPM Event ya no es experimental, que es estable desde la versión 2.4 de Apache. Pero algo no va bien o falta documentación.

Un gráfico sobre los errores 503 detectados:

mpm-event-mpm-prefork

Seguiré investigando a ver si puedo publicar la solución.

Probé varias configuraciones en un entorno de pruebas. Pero la realidad siempre es diferente. Simular el tráfico real es muy difícil. Y desde luego el servidor no se comportó igual con todas las IP, url, y user-agents… fluctuante que se tiene en un entorno real.

Move fast and break things. Unless you are breaking stuff, you are not moving fast enough.

Mark Zuckerberg


Leave a Reply