PHP-FPM es una implementación de PHP con algunas características adicionales a FastCGI. Generalmente el uso de PHP-FPM se suele dar en sitios web con mucho tráfico. La principal ventaja de usar PHP-FPM es que utiliza mucha menos memoria y CPU en comparación otro método de ejecución de PHP. La razón principal es que demoniza a PHP, transformándolo así en un proceso de fondo, mientras que proporciona un script CLI para gestionar las peticiones de PHP.

Pasos Previos

Para esta configuración, es necesario tener un servidor con Nginx y PHP instalado. Entendemos que este tutorial puede funcionar en la mayoría de distribuciones de GNU/Linux. En nuestro caso, lo estamos configurado bajo Ubuntu 22.04.

En el siguiente tutorial aprenderás a instalar PHP-FPM, configurar una Pool para PHP-FPM, configurar Nginx para que utilice esa Pool y comprobar que funciona correctamente.

Instalación de PHP-FPM

Para Ubuntu 22.04, la versión de PHP disponible es PHP 8.1, por lo tanto necesitaremos instalar el paquete necesario:

apt-get install php8.1-fpm
📢
Si estás utilizando una versión diferente a Ubuntu 22.04, seguramente tendrás que instalar el paquete de FPM disponible en tus repositorios para la versión de PHP.

Por si no estuviera el servicio levantado, lo habilitamos al arranque y lo iniciamos:

systemctl enable php8.1-fpm.service
systemctl start php8.1-fpm.service

Configurar nuestra Pool

El servicio PHP-FPM crea una pool por defecto, cuya configuración se encuentra en /etc/php/[Versión_PHP]/fpm/pool.d/www.conf. Se puede personalizar directamente esta pool por defecto o bien podemos crear una nueva.

Si vas a tener diferentes webs en el servidor, es recomendable crear una pool por web, de esta forma tendrás una mejor gestión de todos tus sitios.

Además, la segregación del pool de FPM permitirá ejecutar de forma independiente mediante la creación de su propio proceso maestro. Esto significa que cada aplicación PHP puede ser configurada con sus propios ajustes de caché usando PHP-FPM. Un cambio en la configuración de un pool no requiere iniciar o detener el resto de los pools de FPM.

Crearemos un usuario por cada pool que vayamos a crear, para ello lo primero será crear el grupo y usuario:

groupadd [nombre_grupo]
useradd -g [nombre_grupo] [nombre_usuario]
📢
Ten en cuenta, que a la hora de crear un grupo e usuario para la pool es necesario que sea representativo para tu aplicación web. Por ejemplo, si vas a instalar un WordPress es recomendable configurar un usuario que se llame "wordpress_miweb" o "wp_miweb" o "wpmiweb".

Luego tendremos que crear el fichero de la pool, para ello lo crearemos dentro de la siguiente ruta:

touch /etc/php/[Versión_PHP]/fpm/pool.d/[NombrePool].conf
📢
El nombre de la pool la puedes escoger, busca un nombre que identifique bien el servicio.

Dentro del fichero contendrá lo siguiente, para hacer un ejemplo, tendremos en cuenta que estamos haciendo una pool para una web con WordPress:

[wordpress_miweb]
user = wordpress_miweb
group = wordpress_miweb
listen = /var/run/php8.1-fpm-wp-miweb.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
; Choose how the process manager will control the number of child processes. 
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
📢
En este fichero de configuración tendrás que cambiar todas las variables necesarias para adaptarla a tu configuración, ya sea el usuario y grupo, nombre del sock, etc.

Paso a explicar todas las líneas de la configuración:

  • [wordpress_miweb]: El nombre de la pool. Debe ser único entre todos los nombres de pool que configures.
  • user y group: El usuario y el grupo bajo el cual se ejecutará la pool.
  • listen: El nombre del archivo de socket para este pool.
  • listen.owner y listen.group: Deben coincidir con el usuario y grupo en el que se ejecuta NGINX. En nuestro caso es www-data.
  • php_admin_value: Permite establecer valores de configuración de php personalizados.
  • php_admin_flag: Permite establecer flags booleanas de PHP.
  • pm: La configuración del gestor de procesos y el valor es Dynamic significa que el número de procesos secundarios se establece dinámicamente en base a las siguientes directivas.
  • pm.max_children: El número máximo de procesos secundarios que pueden estar vivos al mismo tiempo.
  • pm.start_servers: El número de procesos secundarios creados en el arranque.
  • pm.min_spare_servers: El número mínimo de procesos secundarios en estado 'idle' (esperando para procesar). Si el número de procesos inactivos es inferior a este número, se crearán algunos procesos más.
  • pm.max_spare_servers: El número máximo de procesos secundarios en estado 'idle' (en espera de procesar). Si el número de procesos inactivos es mayor que este número, se eliminarán algunos procesos.
  • pm.process_idle_timeout: El número máximo deseado de procesos de servidor inactivos. Sólo se utiliza cuando el valor de pm es dinámico.

Tras crear la configuración, procedemos a reiniciar PHP-FPM:

systemctl restart php8.1-fpm

Configuración de Nginx para usar PHP-FPM

Ahora crearemos un bloque de servidor NGINX que hará uso del pool PHP-FPM anterior. Para ello, edita tu archivo de configuración de NGINX y pasa la ruta del archivo de socket del pool usando la opción fastcgi_pass dentro del bloque de ubicación para PHP.

Algo similar a esto:

server {
         listen       80;
         server_name  midominio.com;
         root         /var/www/html/wordpress;

         access_log /var/log/nginx/midominio-access.log;
         error_log  /var/log/nginx/midominio-error.log error;
         index index.html index.htm index.php;

         location / {
                      try_files $uri $uri/ /index.php$is_args$args;
         }

         location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php8.1-fpm-wp-miweb.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }
}

Comprobamos la configuración de Nginx y reiniciamos:

nginx -t
systemctl restart nginx

Y con esto, ya tenemos nuestra pool configurada y lista para ser usada por nuestra aplicación en PHP.

El resultado de un top con la pool funcionando
Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación