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:
|
|
Instalar PHP y PHP-FPM 5.4
|
|
Instalar PHP y PHP-FPM 5.6
|
|
Instalar PHP y PHP-FPM 7.1
|
|
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:
- Performance Analysis of Various Mechanisms for Inter-process Communication, aunque podría resumirse en la gráfica Throughput socket Unix-domain vs TCP vs Pipe.
- Timing a Query, donde se compara el tiempo de respuesta de PostgreSQL usando un
socket Unix-domain
,socket TCP/IP
(31% más lento) ysocket TCP/IP SSL
(175% más lento).
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
ylisten.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
ygroup
, 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
|
|
Configurar PHP-FPM 5.6
Editar el archivo de configuración /opt/remi/php56/root/etc/php-fpm.d/www.conf
|
|
Configurar PHP-FPM 7.1
Editar el archivo de configuración /etc/opt/remi/php71/php-fpm.d/www.conf
|
|
Configurar el virtualhost
Añadir el siguiente bloque entre las etiquetas <virtualhost> ... <\virtualhost>
:
|
|