El autor seleccionó el COVID-19 Relief Fund para que reciba una donación como parte del programa Write for DOnations.
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.
A
en nuestra configuración de DNS: site1.your_domain
y site2.your_domain
.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.
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:
<?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.
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:
<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:
<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:
OutputSyntax 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.
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. 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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
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!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.