Tutorial
Cómo configurar el servidor HTTP Apache con MPM Event y PHP-FPM en Ubuntu 18.04
El autor seleccionó el COVID-19 Relief Fund para que reciba una donación como parte del programa Write for DOnations.
Introducción
El servidor web HTTP Apache ha evolucionado a través de los años para trabajar en entornos diversos y satisfacer diferentes necesidades. Un problema importante, que HTTP Apache tiene que resolver, al igual que cualquier servidor web, es cómo administrar los diferentes procesos para presentar una solicitud de protocolo http. Esto implica abrir un socket, procesar la solicitud, mantener la conexión abierta durante un período determinado, administrar los nuevos eventos que se producen a través de esa conexión y devolver el contenido producido por un programa escrito en un lenguaje específico (como PHP, Perl o Python). Estas tareas se realizan y se controlan con un módulo de procesamiento múltiple (MPM).
HTTP Apache viene con tres MPM diferentes:
- Pre-fork: se crea un nuevo proceso para cada conexión entrante que llega al servidor. Cada proceso se separa de los demás, por lo que no comparten memoria entre ellos, incluso si están realizando llamadas idénticas en algún momento de su ejecución. Esta es una forma segura para ejecutar aplicaciones vinculadas a bibliotecas que no son compatibles con la ejecución de subprocesos; generalmente, aplicaciones o bibliotecas más antiguas.
- Worker: un proceso primario se encarga de iniciar un conjunto de procesos secundarios, algunos de los cuales están atentos a nuevas conexiones entrantes y otros presentan el contenido solicitado. Cada proceso está encadenado (un solo hilo puede gestionar una conexión), de modo que un proceso puede gestionar varias solicitudes al mismo tiempo. Este método para manipular las conexiones fomenta una mejor utilización de los recursos, y, a la vez, mantiene la estabilidad. Esta es una consecuencia del conjunto de procesos disponibles, que a menudo tiene hilos disponibles listos para presentar nuevas conexiones.
- Event: tomando a worker como base, este MPM va más allá al optimizar la forma en que el proceso primario programa las tareas de los procesos secundarios y los hilos asociados a ellos. Por defecto, una conexión se mantiene abierta durante 5 segundos y se cierra si no sucede ningún evento; este es el valor predeterminado de la directiva keep-alive, que conserva el hilo asociado a ella. Event MPM habilita el proceso para la administración de hilos de manera que algunos queden libres para administrar las nuevas conexiones entrantes y, a la vez, otros se mantengan vinculados a las conexiones en vivo. Al permitir la redistribución de las tareas asignadas a los hilos, se logrará una mejor utilización y un mayor rendimiento de los recursos.
MPM Event es un módulo de procesamiento múltiple rápido disponible en el servidor web HTTP Apache.
PHP-FPM es el administrador de procesos FastCGI para PHP. El protocolo FastCGI se basa en la Interfaz de Acceso Común (CGI), un protocolo que se encuentra entre las aplicaciones y los servidores web, como HTTP Apache. Permite a los programadores desarrollar aplicaciones de forma separada del comportamiento de los servidores web. Los programas ejecutan los procesos de manera independiente y pasan su producto al servidor web a través de este protocolo. Cada vez que una aplicación necesite procesar una nueva conexión, se creará un nuevo proceso.
Combinar el módulo MPM Event en HTTP Apache con el administrador de proceso de FastCGI para PHP (PHP-FPM) le permite a un sitio web cargar más rápido y administrar más conexiones simultáneas, mientras utiliza menos recursos.
En este tutorial, cambiará el módulo de procesamiento múltiple predeterminado de pre-fork a event y utilizará el administrador de procesos PHP-FPM para gestionar el código PHP en lugar del clásico mod_php
en HTTP Apache, con el propósito de mejorar el rendimiento de la pila LAMP.
Requisitos previos
Para completar esta guía, necesitará lo siguiente:
- Un servidor de Ubuntu 18.04 configurado mediante la guía de configuración inicial para servidores de Ubuntu 18.04, un usuario sudo no root y un firewall.
- La pila LAMP que instaló en su servidor siguiendo el tutorial Cómo instalar Linux, Apache, MySQL, PHP (pila LAMP) en Ubuntu 18.04.
Paso 1: Cambiar el módulo de procesamiento múltiple
Ubuntu hereda la secuencia de comandos para habilitar o deshabilitar los módulos de HTTP Apache de su distribución principal, Debian. En este paso, utilizará este conjunto de herramientas para deshabilitar el módulo Pre-fork y habilitar el módulo Event.
También, detendrá HTTP Apache, deshabilitará el módulo PHP 7.2
, vinculado al módulo Pre-fork, y, luego, deshabilitará Pre-fork para habilitar de inmediato el módulo Event.
Primero, detendrá el servicio de HTTP Apache:
- sudo systemctl stop apache2
Ahora, puede deshabilitar el módulo PHP 7.2
, que está enlazado al módulo Pre-fork:
- sudo a2dismod php7.2
Luego, deshabilite el módulo Pre-fork MPM:
- sudo a2dismod mpm_prefork
Ahora, habilite el módulo Event MPM:
- sudo a2enmod mpm_event
Cambió el MPM de pre-fork a event y eliminó la conexión del módulo PHP 7.2
ubicado entre PHP y HTTP Apache. En el siguiente paso, instalará el módulo php-fpm
, así como los módulos de las bibliotecas y del proxy relacionados. Configurará HTTP Apache para que también pueda comunicarse con PHP.
Paso 2: Configurar HTTP Apache para utilizar el administrador de procesos de FastCGI
En esta etapa, cambió el MPM de Pre-fork a Event a fin de modificar la manera en que HTTP Apache procesa las conexiones. Sin embargo, durante ese proceso deshabilitó el módulo de PHP que conectaba HTTP Apache con cualquier programa que se ejecute en PHP.
En este paso, instalará el procesador de PHP-FPM para que HTTP Apache pueda procesar los programas en PHP nuevamente. También instalará las bibliotecas de dependencias y habilitará los módulos para que ambos puedan cooperar de una manera fluida y más rápida que antes.
Primero, instale php-fpm
. El siguiente comando instalará el paquete PHP-FPM y habilitará automáticamente el servicio php7.2-fpm
, que está integrado con systemd, de modo que el servicio comience en el momento del inicio:
- sudo apt install php-fpm
Para poder comunicarse, HTTP Apache y PHP necesitan una biblioteca que habilite esa capacidad. Ahora, instalará libapache2-mod-fcgid
, que puede servir como una interfaz entre los programas con servidores web, y es específica para HTTP Apache. Esta comunicación se realizará a través de un socket UNIX.
Instale esta biblioteca:
- sudo apt install libapache2-mod-fcgid
Instaló php-fpm
y libappache2-mod-fcgid
, pero ninguno está habilitado aún.
Primero, habilite el módulo php-fpm
con el siguiente comando:
- sudo a2enconf php7.2-fpm
Segundo, habilite el módulo del proxy
de HTTP Apache:
- sudo a2enmod proxy
Tercero, habilite el módulo del proxy
de FastCGI en HTTP Apache:
- sudo a2enmod proxy_fcgi
Nota: con la siguiente línea puede leer la configuración de la interacción entre los programas en PHP y HTTP Apache a través de un socket UNIX:
- cat /etc/apache2/conf-enabled/php7.2-fpm.conf
Ahora, todo está listo para iniciar HTTP Apache. Primero, realizará una comprobación de configuración:
- sudo apachectl configtest
OutputSyntax OK
Después de eso, puede proceder a reiniciar HTTP Apache, ya que se inició automáticamente al instalar la biblioteca de FastCGI, libapache2-mod-fcgid
:
- sudo systemctl restart apache2
Instaló el módulo php-fpm
, configuró HTTP Apache para trabajar con él, habilitó los módulos necesarios para que el protocolo CGI funcione e inició los servicios correspondientes.
Ahora que Apache tiene el módulo Event MPM habilitado y PHP-FPM está activo y ejecutándose, es momento de verificar que todo funcione según lo previsto.
Paso 3: Comprobar su configuración
Ejecutará algunas pruebas para verificar que los cambios de configuración se hayan aplicado. La primera prueba comprobará qué módulo de procesamiento múltiple está utilizando HTTP Apache. La segunda verificará que PHP esté utilizando el administrador de FPM.
Ejecute el siguiente comando para comprobar el servidor HTTP Apache:
- sudo apachectl -M | grep 'mpm'
El resultado será el siguiente:
Outputmpm_event_module (shared)
Puede repetir el mismo proceso para el módulo proxy
y FastCGI:
- sudo apachectl -M | grep 'proxy'
El resultado mostrará lo siguiente:
Outputproxy_module (shared)
proxy_fcgi_module (shared)
Si quiere ver la lista completa de los módulos, puede eliminar la segunda parte del comando, después de -M
.
Ahora, es momento de verificar si PHP está utilizando el administrador de procesos de FastCGI. Para ello, escribirá una pequeña secuencia de comandos PHP que le mostrará toda la información relacionada con PHP.
Ejecute el siguiente comando para escribir un archivo con el siguiente nombre:
- sudo nano /var/www/your_domain/info.php
Añada el siguiente contenido al archivo info.php
:
<?php phpinfo(); ?>
Ahora, visite la URL de su servidor y anexe info.php
al final como se muestra: http://your_domain/info.php
.
La entrada de la API del servidor será FPM/FastCGI.
Elimine el archivo info.php
después de esta comprobación, de modo que no se divulgue públicamente información sobre el servidor:
- sudo rm /var/www/yourdomain.com/info.php
Verificó el estado de funcionamiento del módulo MPM, los módulos que administran el FastCGI y la utilización del código PHP.
Conclusión
Optimizó su pila LAMP original, de modo que se aumentó el número de conexiones para crear nuevos procesos de HTTP Apache, PHP-FPM administrará el código PHP de manera más eficiente y mejoró la utilización general de los recursos.
Consulte la documentación del proyecto del servidor HTTP Apache para obtener más información sobre los diferentes módulos y los proyectos relacionados.