Tutorial

Como executar várias versões do PHP em um servidor usando o Apache e o PHP-FPM no CentOS 7

CentOSPHPLAMP StackOpen Source

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

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

Com os pré-requisitos finalizados, você instalará agora as versões 7.0 e 7.2 do PHP. O repositório SCL (Software Collections) possui várias versões da pilha PHP para o sistema CentOS 7. Se você precisar da versão mais recente do PHP e ela não estiver disponível no SCL, procure no remi PPA (arquivo de pacote pessoal).

Comece instalando o repositório SCL em seu sistema:

  • sudo yum install centos-release-scl -y

Primeiro, vamos descobrir quais versões do PHP 7 estão disponíveis no SCL:

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

Você verá um resultado como este:

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-php73.x86_64 1-1.el7 centos-sclo-rh

Você notará que a versão mais nova (PHP 7.3) também está disponível. No entanto, para nossos exemplos, instalaremos as versões 7.0 e 7.2.

Vamos começar pela versão mais antiga. Instale o rh-php70 e o rh-php70-php-fpm​​​:

  • sudo yum install rh-php70 rh-php70-php-fpm -y
  • O rh-php70 é um metapacote que executa aplicativos PHP.
  • O rh-php70-php-fpm​​​ fornece o interpretador Fast Process Manager, que funciona como um daemon e recebe solicitações do Fast/CGI.

Agora, repita o processo para a versão PHP 7.2. Instale o rh-php72 e o rh-php72-php-fpm.

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

Em seguida, execute os comandos seguintes para começar a utilizar ambas as coleções de softwares:

  • sudo scl enable rh-php70 bash
  • sudo scl enable rh-php72 bash

Por padrão, ambas as versões do PHP estão escutando na porta 9000. Entretanto, neste tutorial, queremos executar as duas versões simultaneamente. Portanto, vamos designar duas novas portas:

Para conseguirmos fazer isso, você pode abrir o /etc/opt/rh/rh-php70/php-fpm.d/www.conf em seu editor de texto de preferência e modificar todas as vezes que o 9000 aparecer por 9002. Em seguida, salve e feche o arquivo e repita o processo para o /etc/opt/rh/rh-php72/php-fpm.d/www.conf, mas, desta vez, substitua os 9000 por 9003. Alternativamente, você pode utilizar esses dois comandos sed para fazer as substituições:

  • 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

Agora, você designou uma porta dedicada para cada um dos seus serviços PHP. No entanto, antes destas modificações funcionarem, você deve adicionar as portas à sua configuração do SELinux.

O SELinux é uma abreviatura de Security Enhanced Linux e ele está habilitado por padrão no CentOS 7. Você precisa adicionar suas novas portas 9002 e 9003 ao seu banco de dados SELinux e atribuí-las aos seus serviços httpd, ou seus aplicativos não funcionarão. Utilize o comando semanage para executar esta tarefa:

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

A flag -a especifica que você está adicionando um objeto ao banco de dados. A flag -t especifica o tipo de objeto, que neste caso é o http_port_t. E a flag -p designa o protocolo tcp. Você pode aprender mais sobre o SELinux e o comando semanage neste tutorial, ou visitando a documentação oficial do SELinux.

Agora, você está pronto para começar e habilitar seus serviços do PHP. Comece com seu serviço rh-php70-php-fpm e habilite-o para ser iniciado na inicialização do sistema:

  • sudo systemctl start rh-php70-php-fpm
  • sudo systemctl enable rh-php70-php-fpm

Em seguida, verifique o status do seu serviço rh-php70-php-fpm:

  • sudo systemctl status rh-php70-php-fpm

Você verá um resultado como este:

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: active (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.

Ao repetir este processo, inicie o serviço rh-php72-php-fpm e habilite-o para ser iniciado na inicialização do sistema:

  • sudo systemctl start rh-php72-php-fpm
  • sudo systemctl enable rh-php72-php-fpm

Em seguida, verifique o status do seu serviço rh-php72-php-fpm:

  • sudo systemctl status rh-php72-php-fpm

Você verá outro resultado como este:

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: active (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.

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/site1.your_domain
  • sudo mkdir /var/www/site2.your_domain

Por padrão, o servidor Web do Apache funciona como um usuário apache e um grupo apache. Por este motivo, o /var/www/ e todos os seus arquivos e sub-diretórios também devem ser propriedade deles. Execute os comandos seguintes para verificar a propriedade e permissões corretas dos diretórios raiz do seu site:

  • sudo chown -R apache:apache /var/www/site1.your_domain
  • sudo chown -R apache:apache /var/www/site2.your_domain
  • sudo chmod -R 755 /var/www/site1.your_domain
  • sudo chmod -R 755 /var/www/site2.your_domain

O comando chown altera a propriedade dos seus dois diretórios do site para o usuário apache e o grupo apache. O comando chmod altera as permissões associadas a esse usuário e grupo, bem como outras.

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 vi /var/www/site1.your_domain/info.php

Adicione a linha a seguir:

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

Salve e feche o arquivo. Agora, copie o arquivo info.php que você criou para o site2:

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

Agora, o seu servidor Web tem os diretórios de documento base 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. Você criará dois novos arquivos de configuração do host virtual dentro do diretório /etc/httpd/conf.d/.

Primeiro,crie um novo arquivo de configuração de host virtual para o site site1.your_domain. Aqui, você direcionará o Apache para renderizar o conteúdo usando o PHP 7.0:

  • sudo vi /etc/httpd/conf.d/site1.your_domain.conf

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

/etc/httpd/conf.d/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9002
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php70-fcgi .php
     Action php70-fcgi /cgi-bin/php70.fcgi
     ErrorLog /var/log/httpd/site1.your_domain_error.log
     CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>

Para o DocumentRoot, você está especificando o caminho do seu diretório raiz do site. Para o ServerAdmin, você está adicionando o e-mail que o administrador do site your_domain pode acessar. Para o ServerName, você está adicionando a url para seu primeiro subdomínio. Para o SetHandler, você está especificando a porta 9002. As diretivas restantes também configuram o seu serviço para implantar o PHP 7.0.

Salve e feche o arquivo.

Em seguida, crie um novo arquivo de configuração de host virtual para o site site2.your_domain. Você especificará este subdomínio para implantar o PHP 7.2:

  • sudo vi /etc/httpd/conf.d/site2.your_domain.conf

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

/etc/httpd/conf.d/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9003
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php72-fcgi .php
     Action php72-fcgi /cgi-bin/php72.fcgi
     ErrorLog /var/log/httpd/site2.your_domain_error.log
     CustomLog /var/log/httpd/site2.your_domain_access.log combined
</VirtualHost>

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á uma saída que mostra Syntax OK:

Output
  • Syntax OK

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

  • sudo systemctl restart httpd

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:

Página de informações do PHP 7.0 Página de informações do PHP 7.2

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 vulnerabilidade de sua segurança. Remova os arquivos:

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

Agora, você tem um único servidor CentOS 7 processando 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 os recursos mais avançados do PHP-FPM, como seu processo de geração adaptável ou como ele pode fazer logs de sdtout e stderr. Como outra 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.

Creative Commons License