*El autor seleccionó COVID-19 Relief Fund para que reciba una donación como parte del programa Write for DOnations.*

Introducción

El servidor web Apache usa hosts virtuales para gestionar varios dominios en una sola instancia. De forma similar, PHP-FPM usa un demonio para gestionar varias versiones de PHP en una sola instancia. Puede usar Apache y PHP-FPM en conjunto para alojar varias aplicaciones web PHP, cada una con una versión distinta de PHP, en un mismo servidor al mismo tiempo. Esto es útil porque diversas aplicaciones pueden requerir distintas versiones de PHP, pero algunas pilas de servidores, como una pila LAMP configurada periódicamente, solo pueden gestionar una. La combinación de Apache con PHP-FPM también es una solución más rentable que alojar cada aplicación en su propia instancia.

PHP-FPM también ofrece opciones de configuración para los registros stderr y stdout, reinicios de emergencia y creación de procesos adaptativos, lo que es útil para sitios muy cargados. De hecho, la combinación de Apache y PHP-FPM es una de las mejores pilas para alojar aplicaciones PHP, especialmente, en cuanto al rendimiento.

En este tutorial, establecerá dos sitios PHP en una sola instancia. Cada sitio usará su propio dominio, y cada dominio implementará su propia versión de PHP. El primero, <^>site1.your_domain<^>, implementará PHP 7.0. El segundo, <^>site2.your_domain<^>, implementará PHP 7.2.

Requisitos previos

php illustration for: Requisitos previos

Paso 1: Instalar las versiones 7.0 y 7.2 de PHP con PHP-FPM

Con los requisitos previos completados, instalará las versiones PHP 7.0 y 7.2. El repositorio SCL (colecciones de software) mantiene numerosas versiones de la pila PHP para el sistema CentOS 7. Si requiere la versión más reciente de PHP y no está disponible en SCL, consulte el PPA (archivo de paquetes personales) remi.

Comience instalando el repositorio SCL en su sistema:

				
					
sudo yum install centos-release-scl -y

				
			

Primero, vamos a descubrir qué versiones de PHP 7 están disponibles en SCL:

				
					
sudo yum list rh-php7[0-9].x86_64

				
			

Verá un resultado como este:

				
					
[secondary_label Output]

Available Packages

rh-php70.x86_64                                 2.3-1.el7                                 centos-sclo-rh

rh-php71.x86_64                                 1-1.el7                                   centos-sclo-rh

rh-php72.x86_64                                 1-2.el7                                   centos-sclo-rh

rh-&lt;^&gt;php73&lt;^&gt;.x86_64                                 1-1.el7                                   centos-sclo-rh

				
			

Observará que la versión más reciente, PHP 7.3 está disponible también. Para nuestros ejemplos, sin embargo, instalaremos las versiones 7.0 y 7.2.

Vamos a comenzar con la versión más antigua. Instale rh-php70 y rh-php70-php-fpm:

				
					
sudo yum install rh-php70  rh-php70-php-fpm -y

				
			
  • rh-php70 es un metapaquete que ejecuta aplicaciones PHP.
  • rh-php70-fpm ofrece el intérprete de Fast Process Manager, que se ejecuta como daemon y recibe solicitudes de Fast/CGI.

Ahora, repita el proceso para la versión 7.2 de PHP. Instale rh-php72 y rh-php72-php-fpm.

				
					
sudo yum install rh-php72  rh-php72-php-fpm -y

				
			

A continuación, ejecute los siguientes comandos usando ambas colecciones de software:

				
					
sudo scl enable rh-php70 bash

sudo scl enable rh-php72 bash

				
			

Por defecto, ambas versiones de PHP escuchan en el puerto 9000. Pero en este tutorial, queremos ejecutar dos versiones simultáneamente. Por tanto, vamos a designar dos nuevos puertos:

Para conseguir esto, puede abrir /etc/opt/rh/rh-php70/php-fpm.d/www.conf en el editor de texto que prefiera y cambiar cada aspecto de 9000 a 9002. Luego guarde y cierre el archivo y repita el proceso para /etc/opt/rh/rh-php72/php-fpm.d/www.conf​​​, y ahora sustituya 9000 con 9003. También puede usar dos comandos sed para realizar las sustituciones:

				
					
sudo sed -i 's/:9000/:9002/'  /etc/opt/rh/rh-php70/php-fpm.d/www.conf

sudo sed -i 's/:9000/:9003/'  /etc/opt/rh/rh-php72/php-fpm.d/www.conf

				
			

Ahora ha designado un puerto dedicado para cada uno de sus servicios PHP. Antes de que funcionen estas modificaciones, sin embargo, debe añadir los puertos a su configuración SELinux.

SELinux es la abreviatura de Security Enhanced Linux, y está habilitado por defecto en CentOS 7. Debe añadir sus nuevos puertos de 9002 y 9003 a su base de datos de SELinux y asignarlos a sus servicios httpd, o sus aplicaciones no se ejecutarán. Utilice el comando semanage para realizar esta tarea:

				
					
sudo semanage port -a -t http_port_t -p tcp 9002

sudo semanage port -a -t http_port_t -p tcp 9003

				
			

El indicador -a especifica que está añadiendo un objeto a la base de datos. El indicador -t especifica el tipo de objeto, que en este caso es http_port_t. Y el indicador -p designa el protocolo tcp. Puede obtener más información sobre SELinux y sobre el comando semanage en este tutorial, o visitando la documentación oficial de SELinux.

Ahora está listo para iniciar y habilitar sus servicios PHP. Comience con su servicio rh-php70-fpm y habilítelo para que se inicie en el arranque:

				
					
sudo systemctl start rh-php70-php-fpm

sudo systemctl enable rh-php70-php-fpm

				
			

A continuación, verifique el estado de su servicio rh-php70-php-fpm:

				
					
sudo systemctl status rh-php70-php-fpm

				
			

Verá un resultado como este:

				
					
[secondary_label Output]

● rh-php70-php-fpm.service - The PHP FastCGI Process Manager

   Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)

   Active: &lt;^&gt;active&lt;^&gt; (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago

 Main PID: 1852 (php-fpm)

   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

   CGroup: /system.slice/rh-php70-php-fpm.service

           ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)

           ├─1853 php-fpm: pool www

           ├─1854 php-fpm: pool www

           ├─1855 php-fpm: pool www

           ├─1856 php-fpm: pool www

           └─1857 php-fpm: pool www



Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...

Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.



				
			

Repitiendo este proceso, inicie el servicio rh-php72-php-fpm y habilítelo para que se inicie en el arranque:

				
					
sudo systemctl start rh-php72-php-fpm

sudo systemctl enable rh-php72-php-fpm

				
			

A continuación, verifique el estado de su servicio rh-php72-php-fpm:

				
					
sudo systemctl status rh-php72-php-fpm

				
			

Verá otro resultado como este:

				
					
[secondary_label Output]

● rh-php72-php-fpm.service - The PHP FastCGI Process Manager

   Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)

   Active: &lt;^&gt;active&lt;^&gt; (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago

 Main PID: 1876 (php-fpm)

   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

   CGroup: /system.slice/rh-php72-php-fpm.service

           ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)

           ├─1877 php-fpm: pool www

           ├─1878 php-fpm: pool www

           ├─1879 php-fpm: pool www

           ├─1880 php-fpm: pool www

           └─1881 php-fpm: pool www



Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...

Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.



				
			

En este punto, instaló dos versiones de PHP en su servidor. A continuación, creará una estructura de directorios para cada sitio web que desee implementar.

Paso 2: Crear estructuras de directorios para los dos sitios web

En esta sección, creará un directorio root de documentos y una página de índice para cada uno de sus dos sitios web.

Primero, cree directorios root de documentos para <^>site1.your_domain<^> y <^>site2.your_domain<^>:

				
					
sudo mkdir /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo mkdir /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

				
			

Por defecto, un servidor web Apache se ejecuta como un usuario apache y un grupo apache. De forma que /var/www/ y todos sus archivos y subdirectorios también deberían ser propiedad de ellos. Ejecute los siguientes comandos para verificar la propiedad y permisos correctos de sus directorios raíz del sitio web:

				
					
sudo chown -R apache:apache /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo chown -R apache:apache /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

sudo chmod -R 755 /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo chmod -R 755 /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

				
			

El comando chown cambia la propiedad de sus dos directorios del sitio web al usuario apache y al grupo apache. El comando chmod cambia los permisos asociados con ese usuario y grupo, además de los otros.

A continuación, creará un archivo info.php en el directorio root de cada sitio web. Esto mostrará la información de la versión de PHP de cada sitio web. Comience con <^>site1<^>:

				
					
sudo vi /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php

				
			

Añada la siguiente línea:

				
					
[label /var/www/site1.your_domain/info.php]

&lt;?php phpinfo(); ?&gt;

				
			

Guarde y cierre el archivo. Ahora, copie el archivo info.php que creó a <^>site2<^>:

				
					
sudo cp /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;/info.php

				
			

Ahora, su servidor web debería tener los directorios root del documento que cada sitio requiere para presentar datos a los visitantes. A continuación, configurará su servidor web Apache para que funcione con dos versiones de PHP distintas.

Paso 3: Configurar Apache en los dos sitios web

En esta sección, creará dos archivos de configuración de host virtual. Esto permitirá que sus dos sitios web funcionen en simultáneo con dos versiones de PHP distintas.

Para que Apache proporcione este contenido, es necesario crear un archivo de host virtual con las directivas correctas. Creará dos nuevos archivos de configuración host virtuales dentro del directorio /etc/httpd/conf.d/.

Primero, cree un nuevo archivo de configuración de host virtual para el sitio web <^>site1.your_domain<^>. Aquí, le indicará a Apache que represente contenido usando PHP 7.0:

				
					
sudo vi /etc/httpd/conf.d/&lt;^&gt;site1.your_domain&lt;^&gt;.conf

				
			

Añada el siguiente contenido: Asegúrese de que la ruta del directorio del sitio web, el nombre del servidor y la versión de PHP concuerden con su configuración:

				
					
[label /etc/httpd/conf.d/site1.your_domain.conf]



&lt;VirtualHost *:80&gt;

     ServerAdmin admin@&lt;^&gt;site1.your_domain&lt;^&gt;

     ServerName &lt;^&gt;site1.your_domain&lt;^&gt;

     DocumentRoot /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

     DirectoryIndex info.php

     SetHandler "proxy:fcgi://127.0.0.1:&lt;^&gt;9002&lt;^&gt;

     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

     AddHandler &lt;^&gt;php70&lt;^&gt;-fcgi .php

     Action &lt;^&gt;php70&lt;^&gt;-fcgi /cgi-bin/&lt;^&gt;php70&lt;^&gt;.fcgi

     ErrorLog /var/log/httpd/&lt;^&gt;site1.your_domain&lt;^&gt;_error.log

     CustomLog /var/log/httpd/&lt;^&gt;site1.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

Para DocumentRoot está especificando la ruta del directorio raíz de su sitio web. Para ServerAdmin, está añadiendo un correo electrónico al que el administrador del sitio <^>your_domain<^> puede acceder. Para ServerName, está añadiendo la url para su primer subdominio. Para SetHandler, está especificando el puerto <^>9002<^>. Las directivas restantes también configuran su servicio para implementar PHP 7.0.

Guarde y cierre el archivo.

A continuación, cree un nuevo archivo de configuración de host virtual para el sitio web <^>site2.your_domain<^>. Especificará que este subdominio implemente PHP 7.2:

				
					
sudo vi /etc/httpd/conf.d/&lt;^&gt;site2.your_domain&lt;^&gt;.conf

				
			

Añada el siguiente contenido: Nuevamente, asegúrese de que la ruta del directorio del sitio web, el nombre del servidor, puerto y la versión de PHP concuerden con su información única:

				
					
[label /etc/httpd/conf.d/site2.your_domain.conf]

&lt;VirtualHost *:80&gt;

     ServerAdmin admin@&lt;^&gt;site2.your_domain&lt;^&gt;

     ServerName &lt;^&gt;site2.your_domain&lt;^&gt;

     DocumentRoot /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

     DirectoryIndex info.php

     SetHandler "proxy:fcgi://127.0.0.1:&lt;^&gt;9003&lt;^&gt;

     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

     AddHandler &lt;^&gt;php72&lt;^&gt;-fcgi .php

     Action &lt;^&gt;php72&lt;^&gt;-fcgi /cgi-bin/&lt;^&gt;php72&lt;^&gt;.fcgi

     ErrorLog /var/log/httpd/&lt;^&gt;site2.your_domain&lt;^&gt;_error.log

     CustomLog /var/log/httpd/&lt;^&gt;site2.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

Guarde y cierre el archivo cuando termine. Luego, compruebe que no haya errores de sintaxis en el archivo de configuración de Apache:

				
					
sudo apachectl configtest

				
			

Verá un resultado que imprime Syntax OK:

				
					
[secondary_label Output]

Syntax OK

				
			

Por último, reinicie el servicio de Apache para implementar los cambios:

				
					
sudo systemctl restart httpd

				
			

Ahora, que configuró Apache para que sirva cada sitio, los probará para asegurarse de que se estén ejecutando las versiones de PHP correspondientes.

Paso 4: Probar los dos sitios web

En este punto, configuró dos sitios web para que ejecuten dos versiones distintas de PHP. Ahora, pruebe los resultados.

Abra su navegador web y visite los dos sitios http://<^>site1.your_domain<^> y http://<^>site2.your_domain<^>. Verá dos páginas como las siguientes:

Observe los títulos. La primera página indica que <^>site1.your_domain<^> implementó la versión 7.0. La segunda, indica que <^>site2.your_domain<^> implementó la versión 7.2.

Ahora que probó sus sitios, elimine los archivos info.php. Plantean una amenaza de seguridad, dado que contienen información confidencial sobre su servidor y usuarios no autorizados pueden acceder a ellos. Elimine los archivos:

				
					
sudo rm -rf /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php

sudo rm -rf /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;/info.php

				
			

Ahora, tiene un único servidor CentOS 7 que gestiona dos sitios web con dos versiones de PHP distintas. Sin embargo, PHP no se limita a este único uso.

Conclusión

Ahora, tiene hosts virtuales y PHP-FPM combinados para servir varios sitios web y varias versiones de PHP en un único servidor. Lo único que limita la cantidad de sitios y versiones de PHP que su servicio de Apache puede gestionar es la potencia de procesamiento de su instancia.

Desde aquí, puede considerar explorar las funciones más avanzadas de PHP-FPM, como su proceso de creación adaptativa y cómo puede registrar sdtout y stderr. También podría ahora proteger sus sitios web. Para hacerlo, puede seguir nuestro tutorial Cómo proteger sus sitios con certificados TLS y SSL gratuitos de Let´s Encrypt.