Cómo configurar Apache HTTP con eventos MPM y PHP-FPM en FreeBSD 12.0
El autor seleccionó el Open Internet/Free Speech Fund para recibir una donación como parte del programa Write for DOnations.
Introducción
El servidor web Apache HTTP ha evolucionado a través de los años para funcionar en diferentes entornos y resolver diferentes necesidades. Un problema importante que Apache HTTP tiene que resolver, como cualquier servidor web, es cómo manejar los diferentes procesos para atender una solicitud de protocolo http. Esto implica abrir un socket, procesar la solicitud, mantener la conexión abierta durante un período determinado, manejar los nuevos eventos que ocurren a través de esa conexión y devolver el contenido producido por un programa realizado en un lenguaje particular (como PHP, Perl o Python). Estas tareas son realizadas y controladas por un Módulo de Multiprocesamiento (MPM).
Apache HTTP viene con tres MPM diferentes:
- Pre-fork : se crea un nuevo proceso para cada conexión entrante que llega al servidor. Cada proceso está aislado de los demás, por lo que no se comparte memoria entre ellos, incluso si están realizando llamadas idénticas en algún punto de su ejecución. Esta es una forma segura de ejecutar aplicaciones vinculadas a bibliotecas que no admiten subprocesos, generalmente aplicaciones o bibliotecas antiguas.
- Trabajador : un proceso padre es responsable de iniciar un grupo de procesos secundarios, algunos de los cuales están atentos a nuevas conexiones entrantes y otros están sirviendo el contenido solicitado. Cada proceso está subprocesado (un solo subproceso puede manejar una conexión), por lo que un proceso puede manejar varias solicitudes simultáneamente. Este método de tratamiento de las conexiones fomenta una mejor utilización de los recursos, al mismo tiempo que mantiene la estabilidad. Esto es el resultado del grupo de procesos disponibles, que a menudo tiene subprocesos libres listos para atender de inmediato nuevas conexiones.
- Evento : basado en el trabajador, este MPM va un paso más allá al optimizar la forma en que el proceso principal programa tareas para los procesos secundarios y los subprocesos asociados a estos. Una conexión permanece abierta durante 5 segundos de forma predeterminada y se cierra si no ocurre ningún evento nuevo; este es el valor predeterminado de la directiva keep-alive, que conserva el subproceso asociado a ella. El MPM de eventos permite que el proceso administre subprocesos de modo que algunos subprocesos estén libres para manejar nuevas conexiones entrantes mientras que otros se mantienen vinculados a las conexiones activas. Permitir la redistribución de tareas asignadas a subprocesos permitirá una mejor utilización y rendimiento de los recursos.
El módulo de eventos MPM es un módulo de multiprocesamiento rápido disponible en el servidor web Apache HTTP.
PHP-FPM es el gestor de procesos FastCGI para PHP. El protocolo FastCGI se basa en la interfaz de puerta de enlace común (CGI), un protocolo que se encuentra entre las aplicaciones y los servidores web como Apache HTTP. Esto permite a los desarrolladores escribir aplicaciones independientemente del comportamiento de los servidores web. Los programas ejecutan sus procesos de forma independiente y pasan su producto al servidor web a través de este protocolo. Cada nueva conexión que necesite ser procesada por una aplicación creará un nuevo proceso.
Al combinar el evento MPM en Apache HTTP con el administrador de procesos PHP FastCGI (PHP-FPM), un sitio web puede cargarse más rápido y manejar más conexiones simultáneas mientras utiliza menos recursos.
En este tutorial mejorará el rendimiento de la pila FAMP cambiando el módulo de multiprocesamiento predeterminado de pre-fork a evento y utilizando el administrador de procesos PHP-FPM para manejar el código PHP en lugar del clásico mod_phpen Apache HTTP.
Nota: a partir del 1 de julio de 2022, DigitalOcean ya no admite la creación de nuevos Droplets de FreeBSD a través del Panel de control o la API. Sin embargo, aún puede crear Droplets de FreeBSD utilizando una imagen personalizada. Aprenda a importar una imagen personalizada a DigitalOcean siguiendo nuestra documentación del producto.
Prerrequisitos
Antes de comenzar esta guía necesitarás lo siguiente:
- Un servidor FreeBSD 12.0 configurado siguiendo esta guía.
- La pila FAMP instalada en su servidor siguiendo este tutorial.
- Acceso a un usuario con privilegios de root (o permitido mediante sudo) para realizar cambios de configuración.
Paso 1: Cambiar el módulo de multiprocesamiento
Para comenzar, busque la directiva pre-fork en el httpd.confarchivo. Este es el archivo de configuración principal de Apache HTTP en el que puede habilitar y deshabilitar módulos. Puede editar y configurar directivas como el puerto de escucha donde Apache HTTP servirá el contenido o la ubicación del contenido que se mostrará en este archivo.
Para realizar estos cambios, utilizará el nlprograma , number line, con la -babandera para contar y numerar líneas de modo que nada se desajuste en una etapa posterior. Combinado con grepeste comando, primero contará todas las líneas en el archivo especificado en la ruta y, una vez terminado, buscará la cadena de caracteres que está buscando.
Ejecute el siguiente comando para que el nlprograma procese y numere las líneas en httpd.conf. Luego, grepprocesará la salida buscando la cadena de caracteres indicada 'mod_mpm_prefork':
- nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
Como resultado verás algo similar a lo siguiente:
Output67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
Vamos a editar la línea67con su editor de texto. En este tutorial, utilizará vi, que es el editor predeterminado en FreeBSD:
- sudo vi +67 /usr/local/etc/apache24/httpd.conf
Añade un #símbolo al principio de la línea para que ésta quede comentada, de la siguiente manera:
/usr/local/etc/apache24/httpd.conf
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...
Al agregar el #símbolo, ha deshabilitado el módulo MPM previo a la bifurcación.
Ahora encontrará la directiva de evento en el mismo httpd.confarchivo.
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
Verá un resultado similar al siguiente:
Output...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Ahora eliminarás el #símbolo en la línea.66Para habilitar el Evento MPM:
- sudo vi +66 /usr/local/etc/apache24/httpd.conf
La directiva quedará ahora redactada de la siguiente manera:
/usr/local/etc/apache24/httpd.conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Ahora que ha cambiado la configuración de pre-fork de MPM a evento, puede eliminar el mod_php73paquete que conecta el procesador PHP a Apache HTTP, ya que ya no es necesario e interferirá si permanece en el sistema:
- sudo pkg remove -y mod_php73
Asegúrese de que la configuración sea correcta ejecutando el siguiente comando para probar:
- sudo apachectl configtest
Si ve Syntax OKen su salida, puede reiniciar el servidor HTTP Apache:
- sudo apachectl restart
Nota: Si hay otras conexiones HTTP en ejecución en su servidor, se recomienda un reinicio ordenado en lugar de un reinicio normal. Esto garantizará que los usuarios no sean expulsados y pierdan su conexión:
- sudo apachectl graceful
Ha cambiado el MPM de pre-fork a evento y ha eliminado la mod_php73conexión del módulo PHP a Apache HTTP. En el siguiente paso, instalará el módulo PHP-FPM y configurará Apache HTTP para que pueda comunicarse con PHP más rápidamente.
Paso 2: Configuración de Apache HTTP para utilizar el administrador de procesos FastCGI
FreeBSD tiene varias versiones compatibles de PHP que puedes instalar a través del administrador de paquetes. En FreeBSD se compilan distintos binarios de las distintas versiones disponibles en lugar de utilizar solo una, como ofrecen la mayoría de las distribuciones GNU/Linux en sus repositorios predeterminados. Para seguir las mejores prácticas, utilizarás la versión compatible, que puedes consultar en la página de versiones compatibles de PHP.
En este paso, agregará PHP-FPM como un servicio en ejecución para iniciarse en el arranque. También configurará Apache HTTP para que funcione con PHP agregando una configuración dedicada para el módulo y habilitando algunos módulos adicionales en httpd.conf.
Primero, deberás agregar algo 'php_fpm_enable=YES'al /etc/rc.confarchivo para que el servicio PHP-FPM pueda iniciarse. Para ello, deberás usar el sysrccomando:
- sudo sysrc php_fpm_enable="YES"
Ahora, agregará el php-fpmmódulo al directorio de módulos de Apache, de modo que esté configurado para que lo use Apache HTTP. Para ello, cree el siguiente archivo:
- sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
Añade lo siguiente a 030_php-fpm.conf:
/usr/local/etc/apache24/modules.d/030_php-fpm.conf
IfModule proxy_fcgi_moduleIfModule dir_moduleDirectoryIndex index.php/IfModuleFilesMatch ".(php|phtml|inc)$"SetHandler "proxy:fcgi://127.0.0.1:9000"/FilesMatch/IfModule
Esto indica que si el módulo 'proxy_fcgi'está habilitado, así como también 'dir_module'cualquier archivo procesado que coincida con las extensiones entre paréntesis debe ser manejado por el administrador de procesos FastCGI que se ejecuta en la máquina local a través del puerto 9000, como si la máquina local fuera un servidor proxy. Aquí es donde el módulo PHP-FPM y Apache HTTP se interconectan. Para lograr esto, activará más módulos durante este paso.
Para habilitar el módulo proxy, primero deberá buscarlo en el httpd.confarchivo:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
Verá un resultado similar al siguiente:
Output...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...
Para descomentar la línea, elimine el #símbolo:
- sudo vi +129 /usr/local/etc/apache24/httpd.conf
La línea se verá de la siguiente manera una vez editada:
/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...
Ahora puedes activar el módulo FastCGI. Busca el módulo con el siguiente comando:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
Verás algo similar a lo siguiente:
Output...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Ahora descomente la línea133como ya has hecho con los otros módulos:
- sudo vi +133 /usr/local/etc/apache24/httpd.conf
Dejarás la línea de la siguiente manera:
/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Una vez hecho esto, iniciará el servicio PHP-FPM:
- sudo service php-fpm start
Y reiniciará Apache para que cargue los últimos cambios de configuración incorporando el módulo PHP:
- sudo apachectl restart
Ha instalado el módulo PHP-FPM, ha configurado Apache HTTP para que funcione con él, habilitó los módulos necesarios para que funcione el protocolo FastCGI e inició los servicios correspondientes.
Ahora que Apache tiene habilitado el módulo Event MPM y PHP-FPM está presente y ejecutándose, es momento de verificar que todo esté funcionando como se espera.
Paso 3: Comprobación de la configuración
Para comprobar que se han aplicado los cambios de configuración, ejecutará algunas pruebas. La primera comprobará qué módulo de multiprocesamiento utiliza Apache HTTP. La segunda verificará que PHP esté utilizando el administrador FPM.
Verifique el servidor HTTP Apache ejecutando el siguiente comando:
- sudo apachectl -M | grep 'mpm'
El resultado será el siguiente:
Outputmpm_event_module (shared)
Puedes repetir lo mismo para el módulo proxy y FastCGI:
- sudo apachectl -M | grep 'proxy'
El resultado mostrará:
Outputproxy_module (shared)proxy_fcgi_module (shared)
Si desea ver la lista completa de módulos, puede eliminar la segunda parte del comando después de -M.
Ahora es el momento de comprobar si PHP está utilizando el administrador de procesos FastCGI. Para ello, deberá escribir un pequeño script PHP que le mostrará toda la información relacionada con PHP.
Ejecute el siguiente comando para escribir un archivo con el siguiente nombre:
- sudo vi /usr/local/www/apache24/data/info.php
Agregue el siguiente contenido al archivo info.php:
información.php
?php phpinfo(); ?
Ahora visita la URL de tu servidor y añádela info.phpal final de la siguiente manera: .http://your_server_IP_address/info.php
La entrada de la API del servidor será FPM/FastCGI .
Recuerde eliminar el info.phparchivo después de esta comprobación para que ninguna información sobre el servidor quede públicamente revelada.
- sudo rm /usr/local/www/apache24/data/info.php
Ha verificado el estado de funcionamiento del módulo MPM, los módulos que manejan FastCGI y el manejo del código PHP.
Conclusión
Ha optimizado su pila FAMP original, por lo que la cantidad de conexiones para crear nuevos procesos HTTP Apache ha aumentado, PHP-FPM manejará el código PHP de manera más eficiente y la utilización general de recursos ha mejorado.
Consulte la documentación del proyecto del servidor HTTP Apache para obtener más información sobre los diferentes módulos y proyectos relacionados.

Deja una respuesta