Cómo configurar Apache HTTP con MPM Event y PHP-FPM en Ubuntu 18.04

El autor seleccionó el Fondo de Ayuda COVID-19 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 trabajar en diferentes entornos y resolver diferentes necesidades. Un problema importante que tiene que resolver Apache HTTP, como cualquier servidor web, es cómo manejar diferentes procesos para servir una petición del protocolo http. Esto implica abrir un socket, procesar la petición, mantener la conexión abierta durante un periodo determinado, manejar los nuevos eventos que se produzcan a través de esa conexión y devolver el contenido producido por un programa hecho en un lenguaje concreto (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, aunque estén realizando llamadas idénticas en algún momento de su ejecución. Esta es una forma segura de ejecutar aplicaciones enlazadas a librerías que no soportan threading -típicamente aplicaciones o librerías más antiguas.
  • Worker: Un proceso padre se encarga de lanzar un conjunto de procesos hijos, algunos de los cuales están a la escucha de nuevas conexiones entrantes y otros sirven el contenido solicitado. Cada proceso tiene un hilo (un solo hilo puede manejar una conexión), por lo que un proceso puede manejar varias solicitudes simultáneamente. Este método de tratamiento de las conexiones favorece una mejor utilización de los recursos, al tiempo que mantiene la estabilidad. Esto es el resultado del pool de procesos disponibles, que a menudo tiene hilos libres disponibles para servir inmediatamente nuevas conexiones.
  • Evento: Basado en worker, este MPM va un paso más allá optimizando cómo el proceso padre programa las tareas a los procesos hijos y los hilos asociados a estos. Una conexión permanece abierta durante 5 segundos por defecto y se cierra si no se produce un nuevo evento; este es el valor por defecto de la directiva keep-alive, que conserva el hilo asociado a ella. El MPM de eventos permite que el proceso gestione los hilos de forma que algunos queden libres para gestionar nuevas conexiones entrantes mientras que otros se mantienen vinculados a las conexiones vivas. Permitir la redistribución de las tareas asignadas a los hilos hará que se utilicen mejor los recursos y el rendimiento.

El módulo MPM Event 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 está basado en el Common Gateway Interface (CGI), un protocolo que se sitúa entre las aplicaciones y los servidores web como Apache HTTP. Esto permite a los desarrolladores escribir aplicaciones por separado 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 gestor de procesos PHP FastCGI (PHP-FPM) un sitio web puede cargar más rápido y manejar más conexiones concurrentes a la vez que utiliza menos recursos.

En este tutorial mejorarás el rendimiento de la pila LAMP cambiando el módulo de multiprocesamiento por defecto de prefork a evento y utilizando el gestor de procesos PHP-FPM para manejar el código PHP en lugar del clásico mod_php en Apache HTTP.

Requisitos previos

Antes de comenzar esta guía necesitarás lo siguiente:

  • Un servidor Ubuntu 18.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 18.04, incluyendo un usuario sudo no root y un firewall.
  • La pila LAMP instalada en su servidor siguiendo Cómo instalar Linux, Apache, MySQL, PHP (pila LAMP) en Ubuntu 18.04.

Paso 1 – Cambiar el módulo de multiprocesamiento

Ubuntu hereda los scripts para activar o desactivar los módulos HTTP de Apache de su distribución madre, Debian. Utilizará este conjunto de herramientas en este paso para deshabilitar el módulo Pre-fork y habilitar el módulo Event.

En este paso detendrá Apache HTTP, deshabilitará el módulo PHP 7.2 vinculado al módulo Pre-fork, y luego deshabilitará Pre-fork para habilitar inmediatamente el módulo Event.

Primero detendrá el servicio Apache HTTP:

  • sudo systemctl stop apache2

Ahora puede desactivar el módulo PHP 7.2, que está relacionado con el módulo Pre-fork:

  • sudo a2dismod php7.2

A continuación, desactive el módulo Pre-fork MPM:

  • sudo a2dismod mpm_prefork

Ahora habilite el módulo MPM de eventos:

  • sudo a2enmod mpm_event

Ha cambiado el MPM de prefork a eventos y ha eliminado la conexión del módulo PHP 7.2 entre PHP y Apache HTTP. En el siguiente paso instalarás el módulo php-fpm, así como las librerías y módulos proxy relacionados. Configurará Apache HTTP para que también pueda comunicarse con PHP.

Paso 2 – Configurar Apache HTTP para usar el gestor de procesos FastCGI

En esta etapa ha cambiado la forma en que Apache HTTP procesa las conexiones pasando del MPM Pre-fork al Event. Sin embargo, en el camino ha desactivado el módulo de PHP que conectaba Apache HTTP con cualquier programa que se ejecutara en PHP.

En este paso instalará el procesador PHP-FPM para que Apache HTTP vuelva a ser capaz de procesar programas PHP. Y también instalarás las librerías de dependencia y habilitarás los módulos para que ambos puedan cooperar sin problemas y más rápido que antes.

Primero instala php-fpm. El siguiente comando instalará el paquete PHP-FPM y habilitará automáticamente el servicio php7.2-fpm integrado con systemd, para que el servicio se inicie en el momento del arranque:

  • sudo apt install php-fpm

Para comunicarse, Apache HTTP y PHP necesitan una librería que habilite esa capacidad. Ahora se instalará libapache2-mod-fcgid, que es capaz de servir de interfaz entre los programas con los servidores web, y es específica para Apache HTTP. Esta comunicación se realizará a través de un socket UNIX.

Instala esta librería:

  • sudo apt install libapache2-mod-fcgid

Has instalado php-fpm y el libapache2-mod-fcgid, pero ninguno de los dos está habilitado todavía.

Primero habilita el módulo php-fpm con el siguiente comando:

  • sudo a2enconf php7.2-fpm

Segundo habilita el módulo Apache HTTP proxy:

  • sudo a2enmod proxy

Tercero habilita el módulo FastCGI proxy en Apache HTTP:

  • sudo a2enmod proxy_fcgi

Nota: Puedes leer la configuración de esta interacción entre los programas PHP y Apache HTTP a través de un socket UNIX con lo siguiente:

  • cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Ahora todo está en su sitio para que puedas iniciar Apache HTTP. Primero harás una comprobación de la configuración:

  • sudo apachectl configtest
Output
Syntax OK

Después puedes proceder a reiniciar Apache HTTP, ya que se inició automáticamente al instalar la librería FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Has instalado el módulo php-fpm, has configurado Apache HTTP para que funcione con él, has habilitado los módulos necesarios para que el protocolo FastCGI funcione, y has iniciado los servicios correspondientes.

Ahora que Apache tiene habilitado el módulo Event MPM y que PHP-FPM está presente y funcionando, es el momento de comprobar que todo funciona como es debido.

Paso 3 – Comprobación de la configuración

Para comprobar que los cambios de configuración se han aplicado, realizarás algunas pruebas. La primera comprobará qué módulo de multiprocesamiento está utilizando Apache HTTP. La segunda verificará que PHP está utilizando el gestor FPM.

Comprueba el servidor Apache HTTP ejecutando el siguiente comando:

  • sudo apachectl -M | grep 'mpm'

Su salida será la siguiente:

Output
mpm_event_module (shared)

Puedes repetir lo mismo para el módulo proxy y FastCGI:

  • sudo apachectl -M | grep 'proxy'

La salida será la siguiente:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Si desea ver la lista completa de los módulos, puede eliminar la segunda parte del comando después de -M.

Ahora es el momento de comprobar si PHP está utilizando el gestor de procesos FastCGI. Para ello escribirás un pequeño script PHP que te mostrará toda la información relacionada con PHP.

Ejecuta el siguiente comando para escribir un archivo con el siguiente nombre:

  • sudo nano /var/www/your_domain/info.php

Añade el siguiente contenido en el archivo info.php:

info.php
<?php phpinfo(); ?>

Ahora visita la URL de tu servidor y añade info.php al final de esta manera: http://your_domain/info.php.

La entrada de la API del servidor será FPM/FastCGI.

PHP revisa la entrada de la API del servidor FPM/FastCGI

Borra el fichero info.php después de esta comprobación para que no se revele públicamente ninguna información sobre el servidor:

  • sudo rm /var/www/yourdomain.com/info.php

Ha comprobado el estado de funcionamiento del módulo MPM, los módulos que manejan el FastCGI y el manejo del código PHP.

Conclusión