*O autor selecionou a COVID-19 Relief Fund​​​​​ para receber uma doação como parte do programa Write for DOnations.*

Introdução

O servidor Web do Apache usa hosts virtuais para gerenciar vários domínios em uma única instância. De igual modo, o PHP-FPM utiliza um daemon para gerenciar várias versões de PHP em uma única instância. Você pode usar o Apache e o PHP-FPM juntos para hospedar vários aplicativos Web em PHP, cada qual usando uma versão diferente de PHP, porém todas as versões em um mesmo servidor e ao mesmo tempo. Isso é útil, pois diferentes aplicativos exigem diferentes versões de PHP. Porém, algumas pilhas de servidor – como uma pilha LAMP configurada regularmente – podem gerenciar somente uma versão de PHP. A combinação do Apache com o PHP-FPM também é uma solução mais econômica do que hospedar cada aplicativo em sua própria instância.

O PHP-FPM também oferece opções de configuração para o acesso ao stderr e ao stdout, reinicializações de emergência e geração de processos adaptáveis, o que é útil para sites muito carregados. Na verdade, o uso do Apache com o PHP-FPM é uma das melhores pilhas para a hospedagem de aplicativos PHP, especialmente em relação ao desempenho.

Neste tutorial, você configurará dois sites PHP em uma única instância. Cada site usará seu próprio domínio e cada domínio implantará sua própria versão de PHP. O primeiro, <^>site1.your_domain<^>, implantará o PHP 7.0. O segundo, <^>site2.your_domain<^>, implantará o PHP 7.2.

Pré-requisitos

php illustration for: Pré-requisitos

Passo 1 — Instalando as versões 7.0 e 7.2 do PHP com o PHP-FPM

Com os pré-requisitos concluídos, você instalará as versões 7.0 e 7.2 do PHP, além do PHP-FPM e várias extensões adicionais. Mas para realizar isso, primeiro você precisará adicionar o repositório Ondrej PHP ao seu sistema.

Execute o comando apt-get para instalar o software-properties-common:

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

				
			

O pacote software-properties-common fornece o utilitário de linha de comando apt-add-repository, o qual você utilizará para adicionar o repositório PPA (arquivo de pacote pessoal) ondrej/php.

Agora, adicione o repositório ondrej/php ao seu sistema. O PPA ondrej/php terá versões mais recentes do PHP do que as encontradas nos repositórios oficiais do Ubuntu. Ele também permitirá que instale várias versões do PHP no mesmo sistema:

				
					
sudo add-apt-repository ppa:ondrej/php

				
			

Atualize o repositório:

				
					
sudo apt-get update -y

				
			

Em seguida, instale o php7.0, o php7.0-fpm, o php7.0-mysql, o libapache2-mod-php7.0 e o libapache2-mod-fcgid com os comandos a seguir:

				
					
sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y

				
			
  • O php7.0 é um metapacote utilizado para executar aplicativos PHP.
  • O php7.0-fpm fornece o interpretador do gerenciador de processos rápidos que funciona como um daemon e recebe solicitações do Fast/CGI.
  • O php7.0-mysql conecta o PHP ao banco de dados MySQL.
  • O libapache2-mod-php7.0 fornece o módulo PHP para o servidor Web do Apache.
  • O libapache2-mod-fcgid contém um mod_fcgid que inicia uma série de instâncias do programa CGI para lidar com solicitações simultâneas.

Agora, repita o processo para a versão PHP 7.2. Instale o php7.2, o php7.2-fpm, o php7.2-mysql e o libapache2-mod-php7.2:

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

				
			

Após instalar ambas as versões do PHP, inicie o serviço php7.0-fpm:

				
					
sudo systemctl start php7.0-fpm

				
			

Em seguida, verifique o status do serviço php7.0-fpm:

				
					
sudo systemctl status php7.0-fpm

				
			

Você verá o seguinte resultado:

				
					
[secondary_label 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: &lt;^&gt;active&lt;^&gt; (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

				
			

Repetindo esse processo, agora inicie o serviço php7.2-fpm:

				
					
sudo systemctl start php7.2-fpm

				
			

E verifique o status do serviço php7.2-fpm:

				
					
sudo systemctl status php7.2-fpm

				
			

Você verá o seguinte resultado:

				
					
[secondary_label 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: &lt;^&gt;active&lt;^&gt; (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 fim, você deve habilitar vários módulos para que o seu serviço Apache2 possa funcionar com várias versões do PHP:

				
					
sudo a2enmod actions fcgid alias proxy_fcgi

				
			
  • As actions são usadas para executar scripts de CGI baseados no tipo de mídia, ou método de solicitação.
  • O fcgid é uma alternativa de alto desempenho ao mod_cgi que inicia um número suficiente de instâncias do programa CGI para lidar com solicitações simultâneas.
  • O alias dá suporte ao mapeamento de diferentes partes do sistema de arquivos do host na árvore de documentos e ao redirecionamento da URL.
  • O proxy_fcgi permite que o Apache encaminhe solicitações para o PHP-FPM.

Agora, reinicie o serviço do Apache para aplicar suas alterações:

				
					
sudo systemctl restart apache2

				
			

Neste ponto, você instalou duas versões do PHP em seu servidor. Em seguida, você criará uma estrutura de diretório para cada site que deseja implantar.

Passo 2 — Criando estruturas de diretório para ambos os sites

Nesta seção, você criará um diretório para o diretório base e uma página de índice para cada um dos seus dois sites.

Primeiro, crie os diretórios de diretório base para os dois sites, o <^>site1.your_domain<^> e o <^>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 padrão, o servidor Web do Apache funciona como um usuário www-data e um grupo www-data. Para garantir que você tenha a propriedade e as permissões corretas de seus diretórios base de seu site, execute os comandos a seguir:

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

sudo chown -R www-data:www-data /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;

				
			

Em seguida, você criará um arquivo info.php dentro do diretório base de cada site. Isso exibirá as informações da versão do PHP de cada site. Comece com o <^>site1<^>:

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

				
			

Adicione a linha a seguir:

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

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

				
			

Salve e feche o arquivo. Agora, copie o arquivo info.php que você criou para o <^>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

				
			

Agora, o seu servidor Web deverá ter os diretórios base de documentos que cada site exige para fornecer dados aos visitantes. Em seguida, você configurará seu servidor Web do Apache para funcionar com duas versões diferentes do PHP.

Passo 3 — Configurando o Apache para ambos os sites

Nesta seção, você criará dois arquivos de configuração do host virtual. Isso permitirá que seus dois sites funcionem simultaneamente com duas versões diferentes do PHP.

Para que o Apache distribua esse conteúdo, é necessário criar um arquivo de host virtual com as diretivas corretas. Em vez de modificar o arquivo de configuração padrão, localizado em /etc/apache2/sites-available/000-default.conf, você criará dois arquivos dentro do diretório /etc/apache2/sites-available/.

Primeiro, crie um arquivo de configuração de host virtual para o site <^>site1.your_domain<^>. Aqui, você direcionará o Apache a renderizar o conteúdo usando o php7.0:

				
					
sudo nano /etc/apache2/sites-available/&lt;^&gt;site1.your_domain&lt;^&gt;.conf

				
			

Adicione o conteúdo a seguir: Verifique se o caminho do diretório do site, o nome do servidor e a versão de PHP correspondem à sua configuração:

				
					
[label /etc/apache2/sites-available/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



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

        Options Indexes FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all

     &lt;/Directory&gt;



    &lt;FilesMatch \.php$&gt;

      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server

      SetHandler "proxy:unix:/run/php/&lt;^&gt;php7.0&lt;^&gt;-fpm.sock|fcgi://localhost"

    &lt;/FilesMatch&gt;



     ErrorLog ${APACHE_LOG_DIR}/&lt;^&gt;site1.your_domain&lt;^&gt;_error.log

     CustomLog ${APACHE_LOG_DIR}/&lt;^&gt;site1.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

Neste arquivo, você atualizou o DocumentRoot para o seu novo diretório e o ServerAdmin para um e-mail que o administrador do site your_domain pode acessar. Você também atualizou o ServerName, o qual estabelece o domínio base dessa configuração do host virtual, bem como adicionou uma diretiva SetHandler para executar o PHP como um servidor de processos fastCGI.

Salve e feche o arquivo.

Em seguida, crie um arquivo de configuração de host virtual para o site <^>site2.your_domain<^>. Você especificará este subdomínio para implantar o php7.2:

				
					
sudo nano /etc/apache2/sites-available/&lt;^&gt;site2.your_domain&lt;^&gt;.conf

				
			

Adicione o conteúdo a seguir: Novamente, verifique se o caminho do diretório do site, o nome do servidor e a versão do PHP correspondem às suas informações únicas:

				
					
[label /etc/apache2/sites-available/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  



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

        Options Indexes FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all

     &lt;/Directory&gt;



    &lt;FilesMatch \.php$&gt;

      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server

      SetHandler "proxy:unix:/run/php/&lt;^&gt;php7.2&lt;^&gt;-fpm.sock|fcgi://localhost"

    &lt;/FilesMatch&gt;



     ErrorLog ${APACHE_LOG_DIR}/&lt;^&gt;site2.your_domain&lt;^&gt;_error.log

     CustomLog ${APACHE_LOG_DIR}/&lt;^&gt;site2.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

Salve e feche o arquivo quando você terminar. Em seguida, verifique se há erros de sintaxe no arquivo de configuração do Apache:

				
					
sudo apachectl configtest

				
			

Você verá o seguinte resultado:

				
					
[secondary_label Output]

Syntax OK

				
			

Agora, habilite ambos os arquivos de configuração de host virtual:

				
					
sudo a2ensite &lt;^&gt;site1.your_domain&lt;^&gt;

sudo a2ensite &lt;^&gt;site2.your_domain&lt;^&gt;

				
			

Você não precisará do site padrão. Desabilite-o:

				
					
sudo a2dissite 000-default.conf

				
			

Finalmente, reinicie o serviço do Apache para implementar suas alterações:

				
					
sudo systemctl restart apache2

				
			

Após configurar o Apache para atender a cada site, você os testará para garantir que as versões apropriadas do PHP estejam funcionando corretamente.

Passo 4 — Testando os sites

Até aqui, você já configurou dois sites para executar duas versões diferentes do PHP. Agora, teste os resultados.

Abra seu navegador Web e visite os dois sites http://<^>site1.your_domain<^> e http://<^>site2.your_domain<^>. Você verá duas páginas parecidas com estas:

Observe os títulos. A primeira página indica que o <^>site1.your_domain<^> implantou o PHP 7.0. A segunda indica que o <^>site2.your_domain<^> implantou o PHP 7.2.

Agora que você testou seus sites, remova os arquivos info.php. Como eles contêm informações confidenciais sobre seu servidor e estão acessíveis a usuários não autorizados, eles representam uma ameaça à segurança. Para remover os dois arquivos, execute os comandos a seguir:

				
					
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

				
			

Agora, você tem um único servidor Ubuntu 18.04 lidando com dois sites, com duas versões diferentes do PHP. No entanto, o PHP-FPM não está limitado a este aplicativo.

Conclusão

Você combinou os hosts virtuais e o PHP-FPM para atender vários sites e várias versões do PHP em um único servidor. O único limite prático sobre o número de sites PHP e de versões do PHP que o seu serviço do Apache pode gerenciar é a capacidade de processamento de sua instância.

A partir daqui, considere explorar recursos mais avançados do PHP-FPM, como sua geração de processos adaptáveis ou a maneira como ele pode acessar o sdtout e o stderr. Como uma alternativa, você pode agora proteger seus sites. Para fazer isso, você pode seguir nosso tutorial sobre como proteger seus sites com certificados TLS/SSL gratuitos do Let's Encrypt.