A veces, un SysAdmin recibe solicitudes extrañas. Por ejemplo:hace un par de días, mi cliente necesitaba cargar un nuevo sitio, este nuevo sitio necesita PHP7.4 mientras su servidor se ejecuta con PHP7.2. Instalé entonces 7.4 pero todos los demás VirtualHosts (al menos los importantes) fallaron en php7.4. Inicialmente estaba pensando en algún tipo de contenedores pero he encontrado algo más simple. Así es como ejecutar diferentes versiones de PHP en el mismo servidor.
Mi configuración
Siempre creo o reutilizo una máquina virtual para todos mis artículos aquí. Porque siempre debes probar antes de romper algo importante.
Para este tutorial, he creado una nueva instalación de un ¿antiguo? Servidor Ubuntu 18.04. Tendré un sitio, sitio1 (sitio es sitio en español) que necesita PHP 7.2; y otro sitio que necesita PHP 7.4, sitio2 .
1. Agregar repositorio php de Ondrej
En mis días, tenías que editar los archivos de configuración a mano. Pero ahora tenemos este paquete software-properties-common para administrar fácilmente su distribución y fuentes de software de proveedores de software independientes.
Así que nuestro primer paso es instalar ese paquete:
sudo apt-get install software-properties-common
Nuestro segundo paso es agregar el repositorio ejecutando:
sudo add-apt-repositorio ppa:ondrej/php
Preste atención a los mensajes en pantalla y siga las instrucciones. Entonces corre
sudo apt-get update
2. Instale dos versiones de PHP diferentes
2.1. PHP 7.2
El objetivo de este tutorial es mostrarle cómo logré ejecutar diferentes versiones de php en el mismo servidor. No estoy instalando (casi) ningún módulo php pero si estás leyendo esto seguro que necesitas alguno de ellos, soporte mysql por ejemplo. No olvides instalarlos.
sudo apt-get install php7.2 php7.2-fpm libapache2-mod-php7.2 libapache2-mod-fcgid
2.2PHP 7.4
Ahora repita el proceso con php 7.4. Recuerde instalar los módulos php necesarios.
sudo apt-get install php7.4 php7.4-fpm libapache2-mod-php7.4
3. Iniciar servicios fpm
Ahora necesitamos iniciar el servicio fpm para ambas versiones
sudo systemctl start php7.2-fpm sudo systemctl start php7.4-fpm
A continuación, puede comprobar el estado de esos servicios en ejecución:
sudo systemctl estado php7.x-fpm
4. Creación de hosts virtuales
4.1 Datos de VirtualHost
Vamos a crear los primeros directorios bajo /var/www para cada VirtualHost.
mkdir /var/www/sitio1 mkdir /var/www/sitio2 chown -R www-data:www-data /var/www
En segundo lugar, cree un archivo php en cada directorio con el siguiente contenido solo para mostrar información de php:
<?php
phpinfo();
?>
4.2 Configuración de host virtual
Necesitamos crear un archivo .conf para cada sitio, con el siguiente contenido:
nano /etc/apache2/sites-available/sitio1.conf <VirtualHost *:80> ServerAdmin admin@sitio1 ServerName sitio1 DocumentRoot /var/www/sitio1 DirectoryIndex info.php <Directory /var/www/sitio1> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <FilesMatch \.php$> # this part do the trick SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/sitio1_error.log CustomLog ${APACHE_LOG_DIR}/sitio1_access.log combined </VirtualHost>
Luego cree otro archivo /etc/apache2/sites-disponible/sitio2.conf cambiando la información adecuada (sitio1 se convierte en sitio2, php7.2 se convierte en php7.4, etc.)
5. Agregar información de DNS
O no. Quiero decir, en la vida real, deberá crear registros DNS adecuados para ambos sitios. Como esto es solo para fines de prueba y aprendizaje, solo estoy creando registros en mi /etc/hosts
expediente. La dirección IP de esta máquina virtual es 192.168.122.14
Sé que puedo resolver sitio1 y sitio2.
6. Habilitando todo
Necesitamos habilitar algunos módulos de apache necesarios para manejar esta configuración. Luego, para habilitar esos hosts virtuales y, finalmente, para iniciar apache:
sudo a2enmod actions fcgid alias proxy_fcgi sudo a2ensite sitio1 sudo a2ensite sitio2 sudo systemctl start apache2
También puede probar la configuración en busca de errores ortográficos, módulos faltantes o cualquier otro problema con apachetcl configtest
.
7. tiempo de prueba
Ahora necesitamos apuntar un navegador a http://sitio1 y http://sitio2 y verificar si están ejecutando la versión de PHP correcta:
¡Hurra!. Y así es como ejecutar diferentes versiones de PHP en el mismo servidor. Ahora tengo curiosidad sobre qué otras combinaciones podría probar.
Bonificación:Ubuntu antiguo
Mi cliente en realidad tiene Ubuntu 16 que dejó de ser compatible en abril de 2021. El repositorio que tuve que agregar fue ppa:tomvlk/php-archive