Una tarea que deben resolver de manera eficiente los servidores web es como manejar los procesos ante un request, algo de lo que se debe encargar específicamente el módulo MPM (Multi-Processing Module) de Apache. Si observamos en la lista de módulos disponibles vamos a encontrar tres diferentes MPMs: Pre-fork, Worker y Event
Nosotros nos enfocaremos en el módulo MPM-Event que maneja la administración de un proceso principal que administra las tareas repartidas en un pool de sub-procesos y threads asociados a ellos, manteniendo la conexión abierta por 5 segundos (valor por default) y cerrandola si no existen nuevos eventos para estar listo para recibir nuevas conexiones entrantes.
MPM Event (Multi-Processing Module Event)
Deshabilitar mpm_prefork y habilitar mpm_event
systemctl stop apache2
a2dismod php8.1
a2dismod mpm_prefork
a2enmod mpm_event
apt install libapache2-mod-fcgid
a2enconf php8.1-fpm
a2enmod proxy_fcgi
systemctl start apache2
Configurar MPM-Event en /etc/apache2/mods-available/mpm_event.conf
<IfModule mpm_event_module>
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 128
MaxConnectionsPerChild 0
</IfModule>
En este link se puede descargar un script para obtener una configuración inicial de los parámetros
https://gist.github.com/Josh5/ff6ccfe4c75ae27a3f1efebcb645e7c4
PHP-FPM (FastCGI Process Manager)
PHP- FMP es el administrador de procesos FastCGI para PHP basado en Common Gateway Interface (CGI), un protocolo que trabaja entre la aplicación PHP y Apache y permite aislar a los desarrolladores del comportamiento del servidor web. Los programas se ejecutan en procesos independientes y comunican el resultado al servidor web a través de este protocolo. Por cada nueva conexión que necesite ser procesada se creará un nuevo proceso.
Configurar PHP FPM en /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = usuario-site1
group = grupo-site1
listen.owner = www-data
listen.group = www-data
listen = /run/php/php8.1-fpm-site1.sock
pm = dynamic
pm.max_children = 25
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 8
pm.status_path = /status
pm.status_listen = localhost:9001
php_admin_value[open_basedir] = /var/www/html/site1/htdocs/
En este link se puede obtener una aproximación inicial de como configurar los parámetros de pm iniciales.
https://spot13.com/pmcalculator/
Configurar PHP FPM en Apache
<FilesMatch .php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm-site1.sock|fcgi://localhost/"
</FilesMatch>
<LocationMatch "/status">
Order Allow,Deny
Allow from 127.0.0.1
ProxyPass fcgi://localhost:9001/status
</LocationMatch>
Combinando MPM en Apache con PHP FastCGI Process Manager el sitio web se cargará mas rápido y podrá manejar las conexiones simultáneas utilizando menos recursos. A su vez, en servidores web multi-sitio, MPM permite definir una configuración independiente para cada uno de los sitios que agrega una capa de seguridad extra en donde cada proceso se ejecutará con un usuario diferente.
SCRIPT_NAME=/status
SCRIPT_FILENAME=/status
REQUEST_METHOD=GET
cgi-fcgi -bind -connect localhost:9001/status
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-type: text/plain;charset=UTF-8
pool: site1
process manager: dynamic
start time: 12/Feb/2023:10:39:18 +0000
start since: 56108
accepted conn: 3354
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 73
active processes: 0
total processes: 73
max active processes: 48
max children reached: 0
slow requests: 0
Con este procedimiento se modificará la pila LAMP original para que Apache atienda una mayor cantidad de conexiones y el código PHP sea manejado de manera mas eficiente por FPM. Se recomienda consultar la documentación del proyecto Apache HTTP para obtener más información sobre los diferentes módulos y proyectos relacionados.