PHP y PHP-FPM con Apache: diferencias

Si estás desarrollando aplicaciones web con PHP, seguramente te habrás encontrado con distintos métodos para ejecutar el código: mod_php, PHP-FPM, y cómo Apache los maneja. Vamos a desglosarlo.

1. PHP tradicional con Apache (mod_php)

  • Qué es: mod_php es un módulo de Apache que permite ejecutar código PHP directamente dentro del proceso del servidor web.
  • Cómo funciona: Apache carga el intérprete de PHP como parte de sus procesos. Cada petición HTTP que requiere PHP es procesada dentro del mismo proceso de Apache.
  • Ventajas:
    • Simplicidad: fácil de configurar.
    • Integración directa: PHP puede acceder a variables de Apache y módulos internos.
  • Desventajas:
    • Cada proceso de Apache carga PHP completo, lo que aumenta el consumo de memoria.
    • No es tan eficiente en entornos con muchas conexiones concurrentes.

2. PHP-FPM (FastCGI Process Manager)

Requiere monitoreo de los pools de procesos para evitar saturación.

Qué es: PHP-FPM es un gestor de procesos FastCGI para PHP. Funciona como un servicio independiente que Apache llama para ejecutar scripts PHP.

Cómo funciona:

Apache recibe la petición HTTP.

Si es un archivo PHP, Apache lo redirige a PHP-FPM mediante FastCGI (usualmente usando mod_proxy_fcgi). En versiones de Linux Alpine se encuentra incluido en el mod_proxy.

PHP-FPM procesa el script y devuelve la respuesta a Apache.

Ventajas:

Manejo eficiente de procesos: PHP-FPM mantiene pools de procesos listos para servir solicitudes.

Mejor rendimiento en sitios con alta concurrencia.

Permite ejecutar diferentes versiones de PHP para distintos sitios.

Mejor aislamiento de procesos y control de recursos.

Desventajas:

Configuración más compleja.

3. Cómo Apache gestiona PHP con FPM

Apache ya no ejecuta PHP directamente. Usa mod_proxy_fcgi o mod_fastcgi para comunicarse con PHP-FPM:

<FilesMatch .php$>
    SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
</FilesMatch>
  • SetHandler indica que las peticiones PHP se deben enviar a PHP-FPM.
  • PHP-FPM escucha en un socket Unix o puerto TCP y devuelve la salida ya procesada.
  • Apache sigue manejando la conexión HTTP, logging, seguridad y otras funcionalidades, pero la ejecución de PHP queda delegada.

4. Resumen de diferencias

Característicamod_php (tradicional)PHP-FPM (FastCGI)
EjecuciónDentro de ApacheServicio externo
RendimientoBueno en bajo tráficoMejor en alto tráfico
MemoriaAltaOptimizada
Multiples versionesDifícilFácil
AislamientoBajoAlto

5. Conclusión

  • mod_php es más simple y suficiente para sitios pequeños o entornos de desarrollo.
  • PHP-FPM es más eficiente, flexible y escalable, ideal para producción y sitios con alta carga.
  • Apache gestiona la parte HTTP y delega la ejecución de PHP a PHP-FPM, optimizando recursos y manteniendo la seguridad y control.

5. Exclusividad de PHP-FPM y orden de ejecución con Apache

Cuando usamos PHP-FPM, Apache ya no ejecuta PHP directamente. Esto implica dos cosas importantes:

Nombre en paqueteQué incluye
php-apachePHP + mod_php
php-fpmPHP + FPM

1️⃣ Exclusividad de PHP-FPM

  • Solo puede haber un intérprete activo por socket o puerto.
  • PHP-FPM actúa como un servicio independiente, gestionando un pool de procesos que reciben solicitudes de PHP de Apache (o Nginx).
  • Si tienes múltiples instancias de PHP-FPM escuchando en el mismo socket, habrá conflictos.
  • Por eso se habla de “exclusividad”: cada pool de PHP-FPM se asigna a un sitio o versión de PHP y Apache lo llama a través del socket/puerto definido.

6. Ejecución del servidor

1️⃣ Arranque con mod_php (php-apache) en Alpine

En Alpine, normalmente instalas el paquete php-apache2:

# Instalar Apache + mod_php
apk add apache2 php8-apache2

# Iniciar Apache (que ya carga PHP internamente)
httpd -D
  • Nota: No hay servicio PHP externo, todo corre dentro de Apache.

2️⃣ Arranque con PHP-FPM + Apache en Alpine

Instalas PHP-FPM y Apache, y configuras Apache para usar FastCGI:

# Instalar PHP-FPM y Apache
apk add php8-fpm php8-opcache apache2

# Hablitar modulo proxy o proxy_fcgi segun se necesite
...
# Agregar configuracion proxy a FCGI
...

# Iniciar FPM 
php-fpm8 

# Iniciar Apache 
httpd -D