Tutorial

Cómo ejecutar múltiples versiones de PHP en un servidor usando Apache y PHP-FPM en Debian 10

Published on April 29, 2020
Español
Cómo ejecutar múltiples versiones de PHP en un servidor usando Apache y PHP-FPM en Debian 10

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

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

Ahora, con los requisitos previos completos, instalará las versiones 7.0 y 7.2 de PHP, así como PHP-FPM y varias extensiones adicionales. Pero, para conseguir esto, primero necesitará añadir el repositorio sury php a su sistema.

Primero, instale los distintos paquetes requeridos incluyendo curl, wget y gnup2:

  1. sudo apt-get install curl wget gnupg2 ca-certificates lsb-release apt-transport-https -y

Estos paquetes permitirán acceder al repositorio sury php y hacerlo de forma segura. sury php es un repositorio de terceros o PPA (archivo de paquete personal). Ofrece PHP 7.4, 7.3, 7.2, 7.1 y 7.0 para el sistema operativo Debian. También ofrece versiones más actualizadas de PHP que los repositorios oficiales de Debian 10, y le permitirá instalar múltiples versiones de PHP en el mismo sistema.

A continuación, importe la clave del paquete:

  1. wget https://packages.sury.org/php/apt.gpg
  2. sudo apt-key add apt.gpg

Ahora, añada el repositorio sury php a su sistema:

  1. echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list

Actualice el repositorio:

  1. sudo apt-get update -y

A continuación, instale php7.0, php7.0-fpm, php7.0-mysql, libapache2-mod-php7.0, y libapache2-mod-fcgid con los siguientes comandos:

  1. sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y
  • php7.0 es un metapaquete que se usa para ejecutar aplicaciones de PHP.
  • php7.0-fpm ofrece el intérprete de Fast Process Manager, que se ejecuta como demonio y recibe solicitudes de Fast/CGI.
  • php7.0-mysql conecta PHP con la base de datos de MySQL.
  • libapache2-mod-php7.0 ofrece el módulo PHP para el servidor web de Apache.
  • libapache2-mod-fcgid contiene un mod_fcgid que inicia varias instancias de programas de CGI para gestionar solicitudes simultáneas.

Ahora, repita el proceso para la versión 7.2 de PHP. Instale php7.2, php7.2-fpm, php7.2-mysql y libapache2-mod-php7.2.

  1. sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 -y

Después de instalar las dos versiones de PHP, inicie el servicio php7.0-fpm:

  1. sudo systemctl start php7.0-fpm

A continuación, verifique el estado del servicio php7.0-fpm:

  1. sudo systemctl status php7.0-fpm

Verá el siguiente resultado:

Output
● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-04-04 08:51:47 UTC; 1min 17s ago Docs: man:php-fpm7.0(8) Main PID: 13016 (php-fpm7.0) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1149) Memory: 19.1M CGroup: /system.slice/php7.0-fpm.service ├─13016 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf) ├─13017 php-fpm: pool www └─13018 php-fpm: pool www Apr 04 08:51:47 debian10 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager... Apr 04 08:51:47 debian10 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.

Ahora, repitiendo el proceso, inicie el servicio php7.2-fpm:

  1. sudo systemctl start php7.2-fpm

Verifique el estado del servicio php7.2-fpm:

  1. sudo systemctl status php7.2-fpm

Verá el siguiente resultado:

Output
● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-04-04 08:52:52 UTC; 1min 32s ago Docs: man:php-fpm7.2(8) Process: 22207 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.2/fpm/pool.d/www.conf 72 (code=exite Main PID: 22204 (php-fpm7.2) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1149) Memory: 12.0M CGroup: /system.slice/php7.2-fpm.service ├─22204 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) ├─22205 php-fpm: pool www └─22206 php-fpm: pool www Apr 04 08:52:52 debian10 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager... Apr 04 08:52:52 debian10 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

Por último, debe habilitar varios módulos para que su servicio de Apache2 pueda funcionar con varias versiones de PHP:

  1. sudo a2enmod actions fcgid alias proxy_fcgi
  • actions se usa para ejecutar secuencias de comandos de CGI en función del tipo de medio o el método de solicitud.

  • fcgid es una alternativa de alto rendimiento a mod_cgi que inicia una cantidad suficiente de instancias del programa de CGI para gestionar solicitudes simultáneas.

  • alias proporciona la asignación de las distintas partes del sistema de archivos del host en el árbol de documentos y la redirección de URL.

  • proxy_fcgi le permite a Apache reenviar solicitudes a PHP-FPM.

Ahora, reinicie el servicio de Apache para aplicar los cambios:

  1. sudo systemctl restart apache2

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:

  1. sudo mkdir /var/www/site1.your_domain
  2. sudo mkdir /var/www/site2.your_domain

De manera predeterminada, el servidor web Apache se ejecuta como usuario www-data y grupo www-data. Para asegurarse de tener la propiedad y los permisos correctos de sus directorios root del sitio web, ejecute los siguientes comandos:

  1. sudo chown -R www-data:www-data /var/www/site1.your_domain
  2. sudo chown -R www-data:www-data /var/www/site2.your_domain
  3. sudo chmod -R 755 /var/www/site1.your_domain
  4. sudo chmod -R 755 /var/www/site2.your_domain

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:

  1. sudo nano /var/www/site1.your_domain/info.php

Añada la siguiente línea:

/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>

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

  1. sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

Ahora, su servidor web debería tener los directorios root de documentos 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. En vez de modificar el archivo de configuración predeterminado ubicado en /etc/apache2/sites-available/000-default.conf, creará dos archivos nuevos en el directorio /etc/apache2/sites-available/.

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 php7.0:

  1. sudo nano /etc/apache2/sites-available/site1.your_domain.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:

/etc/apache2/sites-available/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php

     <Directory /var/www/site1.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
      SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
</VirtualHost>

En este archivo, actualizó DocumentRoot a su nuevo directorio y ServerAdmin a un correo electrónico al que puede acceder el administrador del sitio your_domain. También actualizó ServerName, que establece el dominio base para esta configuración de host virtual, y añadió una directiva SetHandler para ejecutar PHP como servidor de procesos fastCGI.

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. Le indicará a este subdominio que implemente php7.2:

  1. sudo nano /etc/apache2/sites-available/site2.your_domain.conf

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

/etc/apache2/sites-available/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php  

     <Directory /var/www/site2.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
      SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined
</VirtualHost>

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

  1. sudo apachectl configtest

Verá el siguiente resultado:

Output
Syntax OK

A continuación, habilite los dos archivos de configuración de host virtual:

  1. sudo a2ensite site1.your_domain
  2. sudo a2ensite site2.your_domain

Ahora, deshabilite el sitio predeterminado, dado que no lo necesitará:

  1. sudo a2dissite 000-default.conf

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

  1. sudo systemctl restart apache2

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:

Página de información de PHP 7.0Página de información de PHP 7.2

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. Para eliminar los dos archivos, ejecute los siguientes comandos:

  1. sudo rm -rf /var/www/site1.your_domain/info.php
  2. sudo rm -rf /var/www/site2.your_domain/info.php

Ahora tiene un único servidor Debian 10 que administra dos sitios web con dos versiones PHP diferentes. 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.

Ahora, podría considerar explorar funciones más avanzadas de PHP-FPM, como su proceso de generación adaptativa o su capacidad de registro de sdtout y stderr. Alternativamente, ahora, podría 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.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
hitjethva

author



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel