Asegurando la ejecución de PHP: configuración experta de PHP-FPM con NGINX
10:17, 19.08.2026
PHP-FPM es un gestor de procesos necesario para gestionar las solicitudes web. Este enfoque es considerablemente más rápido en comparación con los métodos CGI tradicionales, como mod_php o SUPHP. La principal ventaja de este método es que consume menos CPU y memoria.
Cómo funciona PHP-FPM entre bastidores
Para comprender mejor cómo funciona todo, repasemos lo que ocurre entre bastidores. Estos son los pasos principales de su funcionamiento:
- Gestión de la solicitud. Cuando el servidor recibe una solicitud procedente de un script PHP, esta se transmite a través de FastCGI a PHP-FPM.
- Gestión de procesos. Una vez recibida la solicitud, PHP-FPM selecciona un proceso disponible del grupo para gestionarla. En caso de que no haya ningún proceso disponible, se puede crear uno nuevo.
- Es posible gestionar varios tipos de procesos, como los procesos maestro y los procesos de trabajo. El proceso maestro es necesario para escuchar las solicitudes actuales y distribuirlas entre los procesos de trabajo disponibles. El proceso de trabajo es necesario para la ejecución de los scripts de PHP. Pueden funcionar en diversos modos, como estático, dinámico y bajo demanda.
- Ejecución. Cuando la solicitud llega al proceso de trabajo, se ejecuta el script de PHP y se envía una salida al servidor.
- Reciclaje del proceso. Los procesos de trabajo pueden reciclarse tras un número específico de solicitudes. Esto es necesario para evitar fugas de memoria
Requisitos previos a la configuración de PHP-FPM con NGINX
- Se puede abrir una sesión SSH en tu sistema con el usuario «sudo» o «root».
- Instalación de PHP y NGINX en su sistema. Si no es así, existen varias instrucciones detalladas sobre el proceso de instalación.
Guía paso a paso para configurar PHP-FPM con NGINX
- Instalación de PHP-FPM
- Configuración del grupo de PHP-FPM
- Configuración de NGINX para utilizar PHP-FPM
- Comprobación de la integración de PHP-FPM y NGINX
Paso 1: Instalación de PHP-FPM en tu servidor
El script PHP no se pudo ejecutar en Nginx porque es necesario disponer de PHP-FPM para una gestión eficaz. PHP-FPM funciona al margen de NGINX creando su propio proceso. Cuando el usuario intenta acceder a una página PHP, el servidor pasa esta solicitud a PHP-FPM.
El proceso de instalación en Ubuntu depende de la versión de Ubuntu y de PHP. Una vez que hayas comprobado si dispones de la última versión de PHP, puedes utilizar el siguiente comando para la instalación de FPM:
sudo apt install -y php8.2-fpm
Tras ejecutar el comando anterior, el servidor se iniciará automáticamente una vez finalizada la instalación. Para comprobarlo, utiliza el siguiente comando:
sudo systemctl status php8.2-fpm
Paso 2: Configuración del grupo de PHP-FPM
El grupo predeterminado se encuentra en la carpeta /etc/php/8.2/fpm/pool.d/, y se puede personalizar según tus necesidades. Sin embargo, un enfoque más habitual consiste en crear grupos independientes para obtener un mayor nivel de control sobre cada proceso FPM. Cada grupo tendrá su propio proceso maestro, y cada aplicación PHP se puede configurar con su propia caché. Se trata de un enfoque bastante práctico, ya que los grupos estarán separados y cualquier cambio en uno de ellos no afectará a los demás.
Ahora, vamos a crear un grupo FPM para ejecutar la aplicación mediante un usuario independiente. Para empezar, creemos un nuevo usuario:
# Crear un grupo del sistema llamado wordpress
sudo groupadd --system wordpress
# Crear un usuario del sistema llamado wordpress, asignarlo al grupo wordpress y establecer que no tenga shell de inicio de sesión
sudo useradd --system --gid wordpress --shell /usr/sbin/nologin --home-dir /var/www/wordpress wordpress
El siguiente paso es acceder al directorio de configuración y crear un archivo de configuración mediante un editor de texto:
# cd /etc/php/8.2/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress
group = wordpress
listen = /run/php/php8.2-fpm-wordpress.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
Veamos algunos de los valores mencionados anteriormente:
- [wordpress_site]: debe indicarse un nombre único para el grupo.
- Usuario/grupo: indica bajo qué cuenta se ejecutará el grupo de servidores.
- Listen: nombre del archivo de socket.
- Listen.owner/group: debe coincidir con el usuario/grupo de NGINX.
- Admin_value/flag: permite configurar valores personalizados y indicadores booleanos.
- pm: al seleccionar «Dynamic», significa que el número de procesos hijos se elige en función de las siguientes directivas.
- max_children: el número máximo de procesos hijos que pueden estar activos al mismo tiempo.
- start_servers: el número de procesos hijos creados al inicio.
- max/min_spare_servers: el número máximo y mínimo de procesos hijos en estado inactivo.
- idle_timeout: número máximo de procesos de servidor inactivos.
Además, es posible elegir entre configuraciones estáticas y bajo demanda. La opción estática tendrá un número fijo de procesos, mientras que, bajo demanda, se crearán procesos hijos para las nuevas solicitudes.
Una vez que hayas terminado con el archivo de configuración, reinicia el servicio fpm:
sudo systemctl restart php8.2-fpm
Paso 3: Configuración de NGINX para utilizar PHP-FPM
El siguiente paso es la creación del bloque de servidor de NGINX. Para ello, es necesario editar el archivo de configuración de NGINX y añadir la ruta del archivo de socket del grupo mediante fastcgi_pass, tal y como se muestra a continuación:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm-wordpress.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
A continuación, reinicia NGINX:
sudo nginx -t
sudo systemctl reload nginx
Paso 4: Comprobación de la integración de PHP-FPM y NGINX
Para comprobar si el archivo de configuración utiliza realmente el nuevo grupo, es necesario crear un archivo php.info en el directorio raíz.
# Accede al directorio de WordPress
cd /var/www/html/wordpress
# Crea un archivo php.info utilizando comillas de seguridad
echo '<?php phpinfo(); ?>' | sudo tee info.php > /dev/null
Una vez creada la página de información, comprueba los valores; si coinciden con los que has indicado en el archivo de configuración de FPM, todo funciona según lo previsto.
Preguntas frecuentes y resolución de problemas
¿Qué es PHP-FPM y por qué combinarlo con NGINX?
PHP-FPM es un gestor de procesos necesario para la gestión de los procesos de PHP. Cuando se combina con NGINX, puede mejorar significativamente la seguridad, el rendimiento y la gestión de los recursos.
¿Cómo puedo vincular NGINX con PHP-FPM correctamente?
Para la vinculación, es necesario configurar NGINX para que utilice PHP-FPM. Esto se puede hacer incluyendo la directiva `fastcgi_pass` en el archivo de configuración. Se puede hacer de la siguiente manera:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm-wordpress.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
¿Cuándo debo utilizar un socket en lugar de un puerto en PHP-FPM?
El uso de sockets ofrece la posibilidad de una comunicación más rápida, ya que no hay necesidad de sobrecarga de red. Un puerto requiere comunicación de red, y este enfoque es mucho más lento. No obstante, el uso de puertos puede resultar adecuado en casos en los que FPM se ejecute en varios contenedores o servidores.
¿Qué provoca un error 502 Bad Gateway y cómo lo soluciono?
Para solucionar este error, es fundamental comprobar si FPM está funcionando y si TCP o el socket están especificados correctamente en la configuración de NGINX. Revisa los registros de FPM en busca de posibles problemas y modifica la configuración del pool según corresponda. Además, comprueba si la configuración de NGINX está pasando correctamente las solicitudes de PHP.
Para consultar los registros, utiliza el siguiente comando:
tail -f /var/log/php8.2-fpm.log
¿Puedo ejecutar varias versiones de PHP en una misma configuración de NGINX?
Por supuesto, se puede hacer configurando grupos de pools independientes y especificando el grupo adecuado para cada dominio o subdominio. Por ejemplo, si utilizas PHP 7.4 y 7.2, puedes hacerlo. A continuación, especifica el grupo adecuado para cada dominio.
¿Dónde puedo encontrar la configuración de los grupos de PHP-FPM?
Normalmente, los grupos se encuentran en /etc/php/8.2/fpm/pool.d/.
¿Cuáles son las mejores prácticas para mejorar el rendimiento de PHP-FPM?
Para obtener un mejor rendimiento, es posible que tengas que ajustar los parámetros pm.min_spare_servers, pm.max_children y pm.start_servers en la configuración. Además, puedes intentar habilitar pm.status_path y pm.max_requests.
Reflexiones finales
En este artículo, hemos mostrado de forma práctica cómo configurar grupos independientes, instalar PHP-FPM, configurar el bloque del servidor NGINX y conectarse al servicio. Con este enfoque, es posible garantizar una mayor escalabilidad y seguridad, así como mejorar las características de rendimiento. Ahora ya sabes cómo asignar los recursos del servidor de la forma más óptima.