Apache com VirtualHost – Múltiplas versões de PHP rodando ao mesmo tempo
Prezados colegas,
Primeiramente saudações “pinguianas” a todos!
A vontade de escrever esse artigo deu-se com a necessidade de migrar um Webserver que estava com uma versão de uma distribuição um tanto quanto defasada.
Para explicar melhor o cenário, temos uma aplicação feita por um desenvolvedor na qual simplesmente não funciona nas versões 7 do PHP.
Segundo o mesmo, efetuar uma atualização para torná-la funcional no PHP 7.3 seria uma ação muito complexa, geraria um custo muito alto e demandaria muito tempo de projeto por se tratar de uma aplicação extremamente grande.
Um outro agravante que serviu como indicativo para efetuar essa migração é que o nosso atual servidor estava rodando um Debian 7 com PHP 5.6 e já não estava mais sendo possível efetuar atualizações de segurança nesse servidor.
Além dessa aplicação que está “amarrada” a versão 5.6 do PHP, temos diversas outras aplicações rodando nesse servidor, mas que podem ser perfeitamente migradas para a versão 7.3.
Fiz um um grande estudo relacionado a estabilidade e segurança e, diante do material e documentação encontrada, decidi que migrarei esse servidor para um CentOS 7.
Foram necessários muitos testes antes de efetivamente conseguir colocar para funcionar ao mesmo tempo a versão 5.6 (para a bendita aplicação que não pode ser migrada) e a versão 7.3 do PHP.
Então, ao ler os procedimentos que vou documentar a seguir, você deve imaginar que foi uma tarefa fácil. Mas não se engane: até eu chegar ao sucesso, foram muitos dias de pesquisas e testes instalando máquina, criando snapshots, tentando configurar, obtendo erros, restaurando snapshots, tentando de novo e etc.
Bom, agora chega de blá blá blá porque está na hora de colocar a mão na massa, certo?
Eu vou partir do princípio que você já tenha uma máquina com CentOS 7 instalada, já tenha rodado um “yum update” para deixá-la atualizada e que já tenha desabilitado o SELINUX.
Vou pressupor também que essa máquina esteja já na rede, com os DNS apontando corretamente para ela. Eu vou usar um nome de domínio fictício aqui (teste.com.br) com dois subdomínios (php56.teste.com.br e php73.teste.com.br).
O subdomínio php56.teste.com.br vai usar a versão 5.6 do PHP e o subdomínio php73.teste.com.br vai usar a versão 7.3 do PHP.
Atenção: Eu sempre sugiro que copiem e colem o comando no terminal/console, para não sair errado.
A primeira coisa que sempre faço quando vou configurar uma máquina com o sistema CentOS, é instalar alguns pacotes básicos que me auxiliam em quase todos os procedimentos. Para isso, eu uso o comando abaixo:
yum install -y mlocate nano mc net-tools rsync \ vim ntsysv wget zip unzip telnet tcpdump yum-utils
Agora, vamos instalar o repositório “epel” e o o repositório “remi”, pois é deles que baixaremos os pacotes necessários para a instalação da solução:
yum install -y epel-release http://rpms.remirepo.net/enterprise/remi-release-7.rpm
Agora vamos instalar o apache, o nosso webserver:
yum install -y httpd
Depois disso, vamos agora instalar os pacotes referentes ao PHP 5.6 (observe que com esse comando, além do php 5.6, eu instalo também alguns módulos que são necessários para os meus sistemas funcionarem:
yum install -y php56 php56-php-fpm php56-php-mcrypt \ php56-php-bcmath php56-php-gd php56-php-dba \ php56-php-ldap php56-php-imap php56-php-mbstring \ php56-php-mysqlnd php56-php-odbc php56-php-soap
Agora, vamos instalar os pacotes referentes ao PHP 7.3 (e também os módulos que necessito):
yum install -y php73 php73-php-fpm php73-php-bcmath \ php73-php-gd php73-php-dba php73-php-ldap \ php73-php-imap php73-php-mbstring php73-php-mysqlnd \ php73-php-odbc php73-php-soap
Agora nós precisamos habilitar os serviços para subirem no boot do servidor, sempre que ele for reiniciado. Para isso, vamos executar os comandos abaixo.
Colocando o apache para iniciar no boot:
systemctl enable httpd
Colocando o php-fpm 5.6 para subir no boot:
systemctl enable php56-php-fpm
Colocando o php-fpm 7.3 para subir no boot:
systemctl enable php73-php-fpm
Agora, precisamos alter as portas desses dois serviços para que não conflitem um com o outro.
Vamos rodar os dois comandos abaixo:
sed -i 's/:9000/:9056/' /etc/opt/remi/php56/php-fpm.d/www.conf sed -i 's/:9000/:9073/' /etc/opt/remi/php73/php-fpm.d/www.conf
O primeiro comando troca a porta do serviço php-fpm (versão 5.6) de 9000 para 9056;
O segundo comando troca a porta do serviço php-fpm (versão 7.3) de 9000 para 9073.
Precisamos agora reiniciar os serviços para efetivar as alterações. Faça os comandos abaixo:
systemctl restart php73-php-fpm systemctl restart php56-php-fpm
Depois, você deve confirmar se os serviços estão rodamos como desejamos. Para isso, faça o comando abaixo:
netstat -nlptu | grep php-fpm
A saída deve ser como na imagem abaixo:
Agora, precisamos criar os scripts CGI que terão a função de “chamar” a execução da versão desejada do PHP. Para isso, faça os comandos abaixo:
Comando para criar o script para chamar a execução do php5.6:
cat > /var/www/cgi-bin/php56.fcgi << EOF #!/bin/bash exec /bin/php56-cgi EOF
Comando para criar o script para chamar a execução do php7.3:
cat > /var/www/cgi-bin/php73.fcgi << EOF #!/bin/bash exec /bin/php73-cgi EOF
Agora, precisamos ajustar as permissões desses scripts. Para isso, faça o comando abaixo:
chmod 755 /var/www/cgi-bin/php*.fcgi
Agora, vamos fazer alguns ajustes no apache.
Vamos alterar o diretório listado no apache de /var/www/html para /var/www:
sed -i 's/Directory \"\/var\/www\/html\"/Directory \"\/var\/www\"/' /etc/httpd/conf/httpd.conf
Agora, vamos renomear o arquivo welcome.conf para que o apache exiba os arquivos contidos nos diretórios mesmo se não tiver nenhum index.php(htm,html,etc).
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.default
Agora vamos inserir algumas linhas no arquivo de configuração do apache. Faça o comando abaixo:
cat >> /etc/httpd/conf/httpd.conf << EOF IncludeOptional conf.d/*/*.conf AddHandler php56-fcgi .php Action php56-fcgi /cgi-bin/php56.fcgi Action php73-fcgi /cgi-bin/php73.fcgi EOF
A primeira linha vai fazer que o apache também leia e interprete arquivos *.conf dentro de subdiretórios criados dentro de “/etc/httpd/conf.d” e não epenas na raiz. Isso vai ser útil na organização dos domínios e subdomínios.
As outras três linhas são responsáveis por fazer o apache usar os scripts CGI.
Agora precisamos criar o diretório onde ficarão os arquivos de configurações e o diretório dos LOGS dos respectivos hosts virtuais:
mkdir /etc/httpd/conf.d/teste.com.br \ /var/log/httpd/teste.com.br
Agora vamos criar o arquivo de configuração do virtual host php56.teste.com.br (que usará a versão 5.6 do PHP). Faça o comando abaixo:
cat > /etc/httpd/conf.d/teste.com.br/php56.conf << EOF <VirtualHost *:80> ServerName php56.teste.com.br DocumentRoot /var/www/teste.com.br/php56 <Directory /var/www/teste.com.br/php56> <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9056" </FilesMatch> DirectoryIndex index.php index.htm index.html </Directory> ErrorLog /var/log/httpd/teste.com.br/php56_error.log CustomLog /var/log/httpd/teste.com.br/php56_access.log combined </VirtualHost> EOF
Agora vamos criar o arquivo de configuração do virtual host php73.teste.com.br (que usará a versão 73 do PHP). Faça o comando abaixo:
cat > /etc/httpd/conf.d/teste.com.br/php73.conf << EOF <VirtualHost *:80> ServerName php73.teste.com.br DocumentRoot /var/www/teste.com.br/php73 <Directory /var/www/teste.com.br/php73> <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9073" </FilesMatch> DirectoryIndex index.php index.htm index.html </Directory> ErrorLog /var/log/httpd/teste.com.br/php73_error.log CustomLog /var/log/httpd/teste.com.br/php73_access.log combined </VirtualHost> EOF
Agora precisamos criar os diretórios que irão ficar os arquivos relacionados aos subdomínios. Faça o comando abaixo:
mkdir -p /var/www/teste.com.br/php56 \ /var/www/teste.com.br/php73
Vamos agora inserir um arquivo que fornece informações de versão de PHP e outros detalhes técnicos dentro desses diretórios. Faça os comandos abaixo:
echo "<?php phpinfo(); ?>" > /var/www/teste.com.br/php56/index.php echo "<?php phpinfo(); ?>" > /var/www/teste.com.br/php73/index.php
Agora, é necessário reiniciar o apache. Para isso, faça o comando abaixo:
systemctl restart httpd
Eu vou imaginar que as portas de acesso ao apache já estejam aberta no firewall nativo do CentOS 7 (caso esteja habilitado). Mas, caso não esteja, faça os comandos abaixo:
firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --reload
Agora, teste o serviço.
Acessando http://php56.teste.com.br, resultado deve ser assim:
Acessando http://php73.teste.com.br, resultado deve ser assim:
Isso é tudo!
Esse artigo foi útil? Colabore com o nosso site para podermos continuar dando mais dicas como essa!
Formas de doação:
- Boleto / Cartão de crédito: https//bit.ly/AprendendoLinux
- Pix: [email protected]
- PicPay: @henrique_fagundes
- PayPal: [email protected]
- Bitcoin: bc1qtnn5z058htzy799dslwrpjcdpm0vuta3vrj28l
Favorecido: Luiz Henrique Marques Fagundes