Tutorial

Cómo ejecutar varias versiones de PHP en un servidor usando Apache y PHP-FPM en Ubuntu 18.04

ApachePHPLAMP StackUbuntu 18.04

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

Introducción

El servidor web Apache utiliza hosts virtuales para gestionar varios dominios en una sola instancia. De forma similar, PHP-FPM utiliza 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. Combinar 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, Apache y PHP-FPM representan una de las mejores pilas para alojar aplicaciones PHP, en especial en términos de 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 poder hacerlo, primero, deberá añadir el repositorio Ondrej PHP a su sistema.

Ejecute el comando apt-get para instalar software-properties-common:

  • sudo apt-get install software-properties-common -y

El paquete software-properties-common proporciona la utilidad de línea de comandos apt-add-repository, que usará para añadir el repositorio de PPA (archivo de paquete personal) ondrej/php.

Ahora, añada el repositorio ondrej/php a su sistema. El PPA ondrej/php tendrá versiones más actualizadas de PHP que los repositorios oficiales de Ubuntu y también le permitirá instalar varias versiones de PHP en el mismo sistema:

  • sudo add-apt-repository ppa:ondrej/php

Actualice el repositorio:

  • 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:

  • 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 utiliza para ejecutar aplicaciones de PHP.
  • php7.0-fpm ofrece el intérprete 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:

  • 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:

  • sudo systemctl start php7.0-fpm

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

  • 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 Sun 2020-03-29 12:53:23 UTC; 15s ago Docs: man:php-fpm7.0(8) Process: 20961 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited, Process: 20979 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exite Main PID: 20963 (php-fpm7.0) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1150) CGroup: /system.slice/php7.0-fpm.service ├─20963 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf) ├─20977 php-fpm: pool www └─20978 php-fpm: pool www

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

  • sudo systemctl start php7.2-fpm

Verifique el estado del servicio php7.2-fpm:

  • 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 Sun 2020-03-29 12:53:22 UTC; 45s ago Docs: man:php-fpm7.2(8) Main PID: 20897 (php-fpm7.2) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1150) CGroup: /system.slice/php7.2-fpm.service ├─20897 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) ├─20909 php-fpm: pool www └─20910 php-fpm: pool www

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

  • sudo a2enmod actions fcgid alias proxy_fcgi
  • actions se utiliza 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 de mod_cgi que inicia una suficientes 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:

  • 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:

  • sudo mkdir /var/www/site1.your_domain
  • 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 contar con la propiedad y los permisos correctos de sus directorios root del sitio web, ejecute los siguientes comandos:

  • sudo chown -R www-data:www-data /var/www/site1.your_domain
  • sudo chown -R www-data:www-data /var/www/site2.your_domain
  • sudo chmod -R 755 /var/www/site1.your_domain
  • 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. Con esto, se mostrará la información de la versión de PHP de cada sitio web. Comience con site1:

  • 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:

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

Ahora, su servidor web debería disponer de 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:

  • 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:

  • 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:

  • sudo apachectl configtest

Verá el siguiente resultado:

Output
Syntax OK

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

  • sudo a2ensite site1.your_domain
  • sudo a2ensite site2.your_domain

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

  • sudo a2dissite 000-default.conf

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

  • sudo systemctl restart apache2

Ahora que configuró Apache para que presente cada sitio, los probará para asegurarse de que estén en ejecucción 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.0 Pá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:

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

Ahora, dispondrá de un único servidor de Ubuntu 18.04 que gestiona dos sitios web con dos versiones de PHP distintas. Sin embargo, PHP no se limita a este único uso.

Conclusión

Dispone de hosts virtuales y PHP-FPM combinados para presentar 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.

A partir de este punto, podría considerar investigar las 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.

0 Comments

Creative Commons License