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

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 apache2En este punto puedes ver que Apache efectivamente incluye MPM event habilitado por defecto.
apachectl -V
Instala PHP-FPM.
apt install php-fpmVerás instrucciones sobre cómo habilitar el procesador PHP en Apache.

Habilita el protocolo FastCGI.
a2enmod proxy_fcgiHabilita la configuración predeterminada de PHP-FPM para Apache.
a2enconf php7.0-fpmNota: 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 apache2Instala el resto de los requisitos para tu aplicación PHP. Aquí tienes un ejemplo:
apt install mariadb-server php-mysqlEsto 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 httpdA 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
Para habilitar MPM event, necesitas editar un archivo de configuración.
sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.confEsto agregará un signo # para comentar (desactivar) la línea LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

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.confInicia Apache y habilítalo para que se inicie automáticamente al arrancar.
systemctl start httpd.service
systemctl enable httpd.serviceVerifica si Apache ahora usa MPM event.
apachectl -V
Instala PHP-FPM y el módulo FastCGI.
yum install php-fpm mod_fcgidCrea “/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.serviceInicia PHP-FPM y habilita su autostart al arrancar.
systemctl start php-fpm.service
systemctl enable php-fpm.serviceConclusió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.