Apache: Instalar y configurar PHP-FPM (FastCGI Process Manager)

El servidor de PHP puede ejecutarse dentro de Apache como un módulo (mod_php) o como un servidor independiente. En caso de que corra como un servidor independiente, la comunicación entre Apache y el servidor PHP puede usar:

  • CGI: es un método de comunicación entre un servidor web y una aplicación externa, es decir, las aplicaciones CGI son ejecutadas por un proceso separado del servidor web. Este proceso es creado con cada petición CGI del servidor web y finalizado cuando termina su trabajo, lo cual hace que el rendimiento CGI sea limitado y poco escalable. Es independiente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje. Es un método antiguo y en desuso debido principalmente a su pobre rendimiento.
  • FastCGI: Es una evolución de CGI donde existe un proceso persistente para procesar las peticiones CGI. Es indepediente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje.
  • PHP-FPM: Es una alternativa a FastCGI para PHP, donde existe un demonio PHP en espera de peticiones CGI a través de un socket TCP o UNIX. Es exclusivo para conectar el servidor web con una aplicación PHP.

En esta entrada se verá como ejecutar multiples versiones de PHP en un mismo servidor usando PHP-FPM. La versión de PHP será configurada de forma individual para cada virtualhost.

Instalar PHP-FPM

Se instalarán múltiples versiones PHP y su correspondiente versión de PHP-FPM a partir de los repositorios remi. Por tanto el primer paso es añadir los repositorios de remi al sistema:

1
2
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm

Instalar PHP y PHP-FPM 5.4

1
yum install php54-php php54-php-xml php54-php-cli php54-php-pear php54-php-pear-XML-Parser php54-php-pear-XML-Serializer php54-php-common php54-php-pear-Pager php54-php-gd php54-php-process php54-php-gd php54-php-soap php54-php-mbstring php54-php-common php54-php-mysql php54-php-fpm

Instalar PHP y PHP-FPM 5.6

1
yum install php56-php php56-php-xml php56-php-cli php56-php-pear php56-php-common php56-php-gd php56-php-process php56-php-gd php56-php-soap php56-php-mbstring php56-php-common php56-php-mysql php56-php-fpm

Instalar PHP y PHP-FPM 7.1

1
yum install php71-php php71-php-xml php71-php-cli php71-php-pear php71-php-common php71-php-gd php71-php-process php71-php-gd php71-php-soap php71-php-mbstring php71-php-common php71-php-mysql php71-php-fpm

Configurar PHP-FPM

socket Unix-domain vs socket TCP/IP

Es posible configurar PHP-FPM para que escuche en un socket TCP/IP o un socket Unix-domain.

Los sockets Unix-domain ofrecen mejor rendimiento que los sockets TCP/IP, por ello se recomienda el uso de sockets Unix-domain cuando la comunicación tiene lugar dentro del mismo servidor. Algunas de las razones por las cuales los sockets Unix-domain son más rápidos y ligeros que los sockets TCP/IP son:

  • No es necesario calcular checksums.
  • No es necesario enrutar el tráfico.
  • No es necesaria la sobrecarga de enviar y procesar ACKs, del control de flujo TCP, la encapsulación/descapsulación de cada capa…

Puede leer más sobre la diferencia entre los sockets TCP/IP y sockets Unix-domain en:

La ventaja clara de los sockets TCP/IP es la independencia, o portabilidad, de poder mover el cliente o el servidor libremente. Aunque en este caso, no aplica.

Configurar PHP-FPM con socket Unix-domain

Los principales parámetros a editar son:

  • listen, indica el socket donde escuchará el demonio PHP-FPM.
  • listen.owner, listen.group y listen.mode, indica el usuario, grupo y permisos del socket. Es importante que el usario/grupo con el que correo el servidor web tenga permisos para leer/escribir en el socket.
  • user y group, indica el usuario y grupo con el que correrá el demonio PHP-FPM.
  • rlimit_files, indica el máximo número de descriptores de archivos que puede abrir el proceso PHP-FPM.
  • rlimit_core, indica el tamaño máximo de un archivo, en caso de que el tamaño del archivo sea superior, será truncado al tamaño máximo definido. El valor por defecto es 0 (unlimited).

Configurar PHP-FPM 5.4

Editar el archivo de configuración /opt/remi/php54/root/etc/php-fpm.d/www.conf

1
2
3
4
listen = /var/run/php56.socket
listen.owner = apache
listen.group = apache
listen.mode = 0660

Configurar PHP-FPM 5.6

Editar el archivo de configuración /opt/remi/php56/root/etc/php-fpm.d/www.conf

1
2
3
4
listen = /var/run/php56.socket
listen.owner = apache
listen.group = apache
listen.mode = 0660

Configurar PHP-FPM 7.1

Editar el archivo de configuración /etc/opt/remi/php71/php-fpm.d/www.conf

1
2
3
4
listen = /var/run/php71.socket
listen.owner = apache
listen.group = apache
listen.mode = 0660

Configurar el virtualhost

Añadir el siguiente bloque entre las etiquetas <virtualhost> ... <\virtualhost>:

1
2
3
4
5
6
7
8
9
10
11
12
13
<Proxy "*">
Require ip 127.0.0.1
</Proxy>
<Directory /var/www/html/vhost_name>
<FilesMatch "\.php">
# PHP 5.4
#SetHandler "proxy:unix:/var/run/php54.socket|fcgi://localhost"
# PHP 5.6
SetHandler "proxy:unix:/var/run/php56.socket|fcgi://localhost"
# PHP 7.1
SetHandler "proxy:unix:/var/run/php71.socket|fcgi://localhost"
</FilesMatch>
</Directory>

Entradas de interés

Contenidos
  1. 1. Instalar PHP-FPM
    1. 1.1. Instalar PHP y PHP-FPM 5.4
    2. 1.2. Instalar PHP y PHP-FPM 5.6
    3. 1.3. Instalar PHP y PHP-FPM 7.1
  2. 2. Configurar PHP-FPM
    1. 2.1. socket Unix-domain vs socket TCP/IP
    2. 2.2. Configurar PHP-FPM con socket Unix-domain
    3. 2.3. Configurar PHP-FPM 5.4
    4. 2.4. Configurar PHP-FPM 5.6
    5. 2.5. Configurar PHP-FPM 7.1
  3. 3. Configurar el virtualhost