Sirviendo varias versiones PHP desde un mismo Apache con FPM

elephantsclouds.png
Solucionex
23
Feb 23

Si te encuentras en el escenario de tener diferentes aplicaciones PHP bajo un mismo Apache y necesitas cambiar la versión de una de ellas, antes de barajar el uso de varios servidores con configuraciones de proxies enrevesadas o contratar un nuevo alojamiento, vamos a ver cómo de una manera sencilla podemos hacer servir varias versiones PHP bajo un mismo servidor Apache.

 

¿Qué es PHP-FPM?

 

Cada vez que Apache recibe la orden de gestionar un archivo PHP, éste utiliza unos procesos llamados handlers, o manejadores en español. Estos Apache Handlers serán los encargados de conectar con el intérprete PHP para que realice las operaciones correspondientes. Existen varios tipos de handlers, cada uno con sus ventajas e inconvenientes, pero nos vamos a centrar en uno de los más utilizados actualmente, PHP-FPM.

FPM, o FastCGI Process Manager, se trata de una implementación de otro handler, FastCGI, con el fin de aportar un mayor número de características que permitan optimizar el rendimiento de cara a aplicaciones con alto tráfico.

Una vez tenemos una pequeña idea de lo que es esto de PHP-FPM, vamos a configurar nuestro Apache HTTP Server tradicional con PHP, para que sirva procesos basados en FPM para cada aplicación teniendo en cuenta que vamos a tener diferentes versiones del lenguaje.

 

Cómo instalar y configurar Apache HTTPS Server con PHP-FPM utilizando varias versiones

 

Introducción

Damos por supuesto que tenemos ya instalado Apache HTTP Server con dos virtual hosts configurados, sitioA.conf y sitioB.conf. Por ejemplo el virtual host del primero sería tal que así:

<VirtualHost *:8001>
    ServerName localhost
    ServerAdmin admin@sitioA.localhost
    DocumentRoot /var/www/html/sitioA

    <Directory /app/sitioA>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/sitioA.error.log
    CustomLog ${APACHE_LOG_DIR}/sitioA.access.log combined
</VirtualHost>

Para el sitioB tendríamos un virtual host similar con puerto 8002 y ruta /var/www/html/sitioB.

 

Instalación del paquete ondreh/php

Este paquete nos permite tener instaladas varias versiones de PHP.

sudo apt update -qy && apt install -qy software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update -qy && apt install -qy php7.4 php7.4-common php7.4-dev php8.1 php8.1-common php8.1-dev

Si fuera necesaria cualquier tipo de librería php tanto para la versión 7.4 como para la versión 8.1, la instalaríamos con APT siguiendo la misma dinámica anterior.

 

Instalación de paquetes PHP-FPM y librerías auxiliares para Apache2

sudo apt update -qy && apt install -qy php7.4-fpm php8.1-fpm libapache2-mod-php7.4 libapache2-mod-php8.1 libapache2-mod-fcgid

 

Activar los servicios PHP-FPM

sudo service php7.4-fpm start
sudo service php8.1-fpm start

 

Añadir módulos a Apache2

sudo a2enmod actions fcgid alias proxy_fcgi setenvif
sudo service apache2 restart

 

Añadir fragmento de código a VirtualHosts

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/phpX.X-fpm.sock|fcgi://localhost"
</FilesMatch>

Sobreescribiendo X.X por la versión de PHP a utilizar en cada caso, en nuestro caso 7.4 y 8.1.

 

Volver a reiniciar Apache

sudo service apache2 restart

 

 

Bibliografía

 

Imagen de portada generada con Midjourney AI