Cómo Configurar Apache y PHP para Sitios Web de Alto Tráfico en Servidores Linux

Apache Php Fpm Featured

Casi todos los tutoriales sobre cómo instalar el stack LAMP (Linux, Apache, MySQL, PHP) recomendarán que uses el módulo integrado de Apache para procesar scripts PHP. Por ejemplo, en Ubuntu se habilitaría esto cuando usas un comando como sudo apt install libapache2-mod-php para instalar un paquete. Esto obligaría a Apache a usar mpm_prefork. Cada vez que un visitante accede a tu sitio web, se lanzará un nuevo proceso para manejar esa conexión. Esto funciona bien cuando el tráfico es bajo.

Pero, se convierte en un gran problema si obtienes un súbito aumento de tráfico. Por ejemplo, un post en Reddit puede incluir tu sitio web, y si el post se vuelve popular, podrías recibir miles de visitantes en solo unos minutos.

En el mejor de los casos, si Apache puede manejar el aumento de tráfico, algunos visitantes desafortunados pueden tener que esperar quizás treinta a sesenta segundos hasta que la página se cargue, lo cual es absurdo en el mundo actual. En el peor de los casos, el servidor empezará a fallar gravemente, y algunas conexiones simplemente serán cerradas por falta de recursos. En este caso, los visitantes verán un error en sus navegadores.

No es un buen escenario de ninguna manera, ya que potenzialmente has perdido la atención de cientos o miles de lectores, clientes o fanáticos interesados.

Desafortunadamente, PHP es un gran consumidor de recursos de cualquier manera. Pero, con mpm_event, Apache puede manejar aumentos repentinos de tráfico de una manera mucho más eficiente. Se recomienda, sin embargo, que tu servidor tenga al menos 2GB de RAM y 2 núcleos de CPU, reales o virtuales, e incluso más si esperas tener picos de tráfico intensos, como más de diez visitantes por segundo. Si usas un servidor privado virtual, agrega más núcleos de CPU virtuales a tu situación y almacenamiento SSD. La RAM es secundaria.

Leer también: Nginx vs Apache: ¿Cuál Te Sirve Mejor?

Cómo Usar Apache MPM Event y PHP-FPM en Distribuciones Basadas en Debian

En Debian, Ubuntu u otras distribuciones de esta familia, simplemente evita instalar el paquete “libapache2-mod-php”. Cuando instalas Apache utiliza MPM event por defecto. Pero al instalar el paquete mencionado, un script desactiva MPM event y habilita MPM prefork. El módulo PHP de Apache solo puede funcionar (de manera segura) con mpm_prefork. Por supuesto, sin “libapache2-mod-php”, no tienes un procesador para archivos PHP. Así que usarás PHP-FPM en lugar del módulo PHP incluido en Apache. Aquí te explico cómo instalar un stack LAMP en un servidor nuevo. Puedes adaptar los pasos según los requisitos de tu aplicación web.

Primero, inicia sesión como root. Luego, instala Apache.

apt update && apt install apache2

En este punto puedes ver que Apache efectivamente incluye MPM event habilitado por defecto.

apachectl -V

Apache Php Fpm Check Mpm Debian

Instala PHP-FPM.

apt install php-fpm

Verás instrucciones sobre cómo habilitar el procesador PHP en Apache.

Apache Php Fpm Enable Php Instructions

Habilita el protocolo FastCGI.

a2enmod proxy_fcgi

Habilita la configuración predeterminada de PHP-FPM para Apache.

a2enconf php7.0-fpm

Nota: en versiones futuras de Debian/Ubuntu, este comando podría cambiar a algo diferente, por ejemplo, a2enconf php7.6-fpm, porque PHP-FPM sería una versión diferente.

Reinicia Apache.

systemctl restart apache2

Instala el resto de los requisitos para tu aplicación PHP. Aquí tienes un ejemplo:

apt install mariadb-server php-mysql

Esto instalaría un servidor de base de datos y el módulo PHP MySQL para que tu aplicación PHP pueda conectarse a una base de datos.

Leer también: Cómo Protegerse Contra DDoS con Mod_evasive en Servidor Apache

Cómo Usar Apache MPM Event y PHP-FPM en Distribuciones Basadas en RedHat

La otra opción popular de distribución de servidor es RedHat o CentOS. De la misma manera que antes, se ofrecerá un ejemplo de una instalación limpia de Apache con MPM event habilitado y PHP-FPM.

Inicia sesión como root e instala Apache.

yum install httpd

A diferencia de las distribuciones basadas en Debian, aquí verás que Apache usa MPM prefork por defecto, al menos en el último CentOS 7 disponible en el momento de escribir esto.

apachectl -V

Apache Php Fpm Check Mpm Centos

Para habilitar MPM event, necesitas editar un archivo de configuración.

sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf

Esto agregará un signo # para comentar (desactivar) la línea LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

Apache Php Fpm Mpm Conffile On Centos

Ahora descomenta (activa) la línea #LoadModule mpm_event_module modules/mod_mpm_event.so eliminando el signo # anterior con el siguiente comando.

sed -i '/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.conf

Inicia Apache y habilítalo para que se inicie automáticamente al arrancar.

systemctl start httpd.service  
systemctl enable httpd.service

Verifica si Apache ahora usa MPM event.

apachectl -V

Apache Php Fpm Mpm Event Enabled Status Centos

Instala PHP-FPM y el módulo FastCGI.

yum install php-fpm mod_fcgid

Crea “/etc/httpd/conf.d/php.conf” para instruir a Apache sobre cómo procesar archivos PHP. Copia TODO el contenido a continuación y pégalo todo a la vez en la terminal, luego presiona ENTER.

cat</etc/httpd/conf.d/php.conf  
# Redirigir a php-fpm local si mod_php no está disponible  
  
  
# Habilitar encabezados de autorización http  
  
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1  
IfModule>  
  
  
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"  
SetHandler "proxy:fcgi://127.0.0.1:9000"  
FilesMatch>  
  
# Negar acceso a fuentes php sin procesar por defecto  
# Para volver a habilitarlo se recomienda habilitar el acceso a los archivos  
# solo en un virtual host o directorio específico  
Require all denied  
FilesMatch>  
# Negar acceso a archivos sin nombre de archivo (por ejemplo, '.php')  
  
Require all denied  
FilesMatch>  
IfModule>  
IfModule>  
PASTE

El crédito por esta gran configuración va a Debian. Otras fuentes recomiendan un archivo de configuración simple como:


SetHandler "proxy:fcgi://127.0.0.1:9000"

Pero esto es vulnerable a algunos ataques, y si ciertos servicios fallan, podrías exponer archivos PHP al público, exponiendo potencialmente contraseñas almacenadas, código y datos sensibles.

Reinicia Apache.

systemctl restart httpd.service

Inicia PHP-FPM y habilita su autostart al arrancar.

systemctl start php-fpm.service  
systemctl enable php-fpm.service

Conclusión

Ahora tienes un servidor Apache que se escala mucho mejor con el tráfico. Sin embargo, recuerda que estás usando la configuración predeterminada, que es lo que es “mejor” para la mayoría de las personas. Si realmente quieres aprovechar al máximo tu servidor HTTP, debes leer sobre varias variables que puedes ajustar. Los valores correctos para estas dependen en gran medida de los recursos de tu servidor, del tráfico esperado y de tu aplicación PHP.