Introducción a PHP-FPM
FPM (FastCGI Process Manager) es una implementación alternativa al PHP FastCGI. FPM se encarga de interpretar código PHP. Aunque normalmente se utiliza junto a un servidor web (Apache2 o ngnix), en este artículo vamos a hacer una introducción a PHP-FPM de manera aislada, vamos a estudiar algunos parámetros de configuración y estudiar su funcionamiento.
Para instalarlo en Debian 9:
apt install php7.0-fpm php7.0
Configuración de php-fpm
Con esto hemos instalado php 7.0 y php-fpm. Veamos primeros algunos ficheros de configuración de php:
La configuración de php está dividida según desde se use:
/etc/php/7.0/cli
: Configuración de php paraphp7.0-cli
, cuando se utiliza php desde la línea de comandos./etc/php/7.0/fpm
: Configuración de php para php-fpm/etc/php/7.0/mods-available
: Módulos disponibles de php que puedes estar configurados en cualquiera de los escenarios anteriores.
Si nos fijamos en la configuración de php para php-fpm:
/etc/php/7.0/fpm/conf.d
: Módulos instalados en esta configuración de php (enlaces simbólicos a/etc/php/7.0/mods-available
)./etc/php/7.0/fpm/php-fpm.conf
: Configuración general de php-fpm./etc/php/7.0/fpm/php.ini
: Configuración de php para este escenario./etc/php/7.0/fpm/pool.d
: Directorio con distintos pool de configuración. Cada aplicación puede tener una configuración distinta (procesos distintos) de php-fpm.
Por defecto tenemos un pool cuya configuración la encontramos en /etc/php/7.0/fpm/pool.d/www.conf
, en este fichero podemos configurar muchos parámetros, los más importantes son:
[www]
: Es el nombre del pool, si tenemos varios, cada uno tiene que tener un nombre.user
ygrorup
: Usuario y grupo con el que se va ejecutar los procesos.-
listen
: Se indica el socket unix o el socket TCP donde van a escuchar los procesos:- Por defecto, escucha por un socket unix:
listen = /run/php/php7.0-fpm.sock
- Si queremos que escuche por un socket TCP:
listen = 127.0.0.1:9000
- En el caso en que queramos que escuche en cualquier dirección:
listen = 9000
- Por defecto, escucha por un socket unix:
-
Directivas de procesamiento, gestión de procesos:
pm
: Por defecto igual adynamic
(el número de procesos se crean y destruyen de forma dinámica). Otros valores:static
oondemand
.- Otras directivas:
pm.max_children
,pm.start_servers
,pm.min_spare_servers
,…
pm.status_path = /status
: No es necesaria, pero vamos a activar la URL destatus
para comprobar el estado del proceso.
Por último reiniciamos el servicio:
systemctl restart php7.0-fpm
Pruebas de funcionamiento
-
Suponemos que tenemos configurado por defecto, por lo tanto los procesos están escuchando en un socket UNIX:
listen = /run/php/php7.0-fpm.sock
Para enviar ficheros php a los procesos para su interpretación vamos a utilizar el programa
cgi-fcgi
:apt-get install libfcgi0ldbl
Y a continuación accedemos a la URL
/status
, para ello:SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php/php7.0-fpm.sock 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: www process manager: dynamic start time: 13/Nov/2017:19:32:50 +0000 start since: 38 accepted conn: 6 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 1 active processes: 1 total processes: 2 max active processes: 1 max children reached: 0 slow requests: 0
Si queremos ejecutar un fichero php, vamos a crear un directorio
/var/www
y vamos a guardar un ficheroholamundo.php
con el siguiente contenido:<?php echo "Hola Mundo!!!";?>
A continuación vamos a indicar el directorio de trabajo en el fichero
/etc/php/7.0/fpm/pool.d/www.conf
:chroot = /var/www
Inicializamos el servicio:
systemctl restart php7.0-fpm
Y podríamos ejecutar el fichero de la siguiente manera:
SCRIPT_NAME=/holamundo.php SCRIPT_FILENAME=/holamundo.php REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php/php7.0-fpm.sock Content-type: text/html; charset=UTF-8 Hola Mundo!!!
-
Si suponemos que hemos configurado php-fpm para que escuche en un socket TCP:
listen = 127.0.0.1:9000
Para realizar las pruebas que hemos probado anteriormente:
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000 SCRIPT_NAME=/holamundo.php SCRIPT_FILENAME=/holamundo.php REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000
Conclusiones
En muchas ocasiones cuando se instala apache2 o nginx junto a php-fpm nos cuesta entender como funciona la interpretación del código PHP por medio de php-fpm. en este artículo he tratado de hacer una introducción a este servicio de manera independiente al servidor web para que se entienda un poco mejor. Espero que haya sido de utilidad.
Comments
Jose Alejandro Ramirez Rivera
CGI es una tecnología de la Worldwide Web que permite a un cliente (navegador) solicitar datos de un programa ejecutado en el servidor cuyo resultado estándar finalmente es un objeto MIME ( texto, audio, video).
FPM (FastCGI Process Manager) se conoce el CGI que usa php.
FPM se encarga de interpretar código php, Aunque normalmente se utiliza con junto con un servidor web.
Corrígeme por favor si estoy equivocado o me falto algo por añadir
José Domingo Muñoz
Si, eso sería correcto.
Un saludo
javier alberto
Que tal, lleva un rato leyendo sobre fpm ya que tengo un problema con mi sitio web, ojala alguien pudiera darme una pista de por donde seguir investigando, el sitio esta en un vps el problema es que de vez en cuando aparecen algunos procesos de php-fpm pool que consumen el 100% del cpu y por tanto el servidor ya no puede manejar mas solicitudes, es un sitio en wordpress, estuve viendo que podria deberse a que algunas tablas de la base de datos usaban el motor myisam y eso generaba un uso excesivo de cpu, cambie las tablas mas grandes a ino y aumente el buffer en ram para ese motor y mejoro bastante, dejo de suceder tan a menudo pero aun pasa cada 2 o 3 días, el problema es que no tengo acceso mas que a cpanel y whm entonces no puedo revisar gran cosa, si a alguien le ha sucedido algo similar me ayudaría mucho que me contaran su experiencia gracias
Leave a Comment
Your email address will not be published. Required fields are marked *