Pesquisa de site

Como executar vários sites com diferentes versões de PHP no Nginx


Às vezes, os desenvolvedores de PHP desejam construir e executar diferentes sites/aplicativos usando diferentes versões de PHP no mesmo servidor web. Como administrador de sistema Linux, você deve configurar um ambiente onde possa executar vários sites usando diferentes versões de PHP em um único servidor web, ou seja, Nginx.

Neste tutorial, explicaremos como instalar múltiplas versões do PHP e configurar o servidor web Nginx para trabalhar com elas através dos blocos de servidor (hosts virtuais no Apache) em Distribuições CentOS/RHEL 7 usando pilha LEMP.

Leia também: Pyenv – Instale várias versões do Python para um projeto específico

Nginx usa PHP-FPM (significa FastCGI Process Manager), que é uma implementação alternativa do PHP FastCGI com alguns recursos extras úteis para sites muito carregados.

Testando a configuração do ambiente

  1. Um servidor CentOS 7 ou RHEL 7 com instalação mínima.
  2. Servidor HTTP Nginx.
  3. PHP 7.1 (para ser usado como versão padrão) e 5.6.
  4. Servidor de banco de dados MariaDB.
  5. Endereço IP do servidor: 192.168.56.10.
  6. Sites: example1.com e example2.com.

Etapa 1: Instalando e ativando o repositório EPEL e Remi

1. Primeiro comece instalando e habilitando o repositório EPEL e Remi, que oferece as versões mais recentes do PHP pilha em distribuições CentOS/RHEL 7.

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

2. Em seguida, instale o pacote yum-utils, que estende as funcionalidades nativas do yum e fornece o comando yum-config-manager, que é usado para ativar ou desative os repositórios Yum no sistema.

yum install yum-utils

Nota: No RHEL 7 você pode habilitar o canal opcional para algumas dependências usando o seguinte comando.

subscription-manager repos --enable=rhel-7-server-optional-rpms

Etapa 2: Instalando o servidor Web Nginx

3. Para instalar a versão mais recente do Nginx, precisamos adicionar o repositório oficial do Nginx, criar um arquivo chamado /etc/yum.repos.d/nginx.repo.

vi /etc/yum.repos.d/nginx.repo

Adicione as seguintes linhas ao arquivo de acordo com sua distribuição.

--------------- On CentOS 7 --------------- 
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/7/$basearch/ 
gpgcheck=0 
enabled=1 


--------------- On RHEL 7 ---------------
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/rhel/7.x/$basearch/ 
gpgcheck=0 
enabled=1 

4. Depois que o repositório nginx for adicionado, você pode instalar o Nginx usando a ferramenta de gerenciamento de pacotes yum, conforme mostrado.

yum install nginx

Etapa 3: Instalando o servidor de banco de dados MariaDB

5. Para instalar a versão mais recente do MariaDB, precisamos adicionar o repositório oficial do MariaDB, criar um arquivo chamado /etc/yum.repos.d/mariadb.repo.

vi /etc/yum.repos.d/mariadb.repo

Adicione as seguintes linhas ao arquivo de acordo com sua distribuição.

--------------- On CentOS 7 --------------- 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1


--------------- On RHEL 7 ---------------
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/rhel7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1 

6. Depois que o repositório MariaDB for adicionado, você poderá instalar o MariaDB usando a ferramenta de gerenciamento de pacotes yum, conforme mostrado.

yum install MariaDB-client MariaDB-server

7. Depois, proteja a instalação do servidor de banco de dados usando o script abaixo. Defina uma senha root e responda y e pressione [Enter] para o restante das perguntas subsequentes para desabilitar o login de usuário root remoto, remover contas de usuários anônimos e testar o banco de dados que por default pode ser acessado por todos os usuários, até mesmo usuários anônimos.

mysql_secure_installation

Leia também: 12 práticas recomendadas de segurança MySQL/MariaDB para Linux

Passo 4: Instalando Múltiplas Versões de PHP

8. Para instalar diferentes versões do PHP para seus projetos, use o comando yum-config-manager para instalar múltiplas versões do PHP junto com a maioria dos módulos necessários, conforme mostrado.

Instale a versão PHP 7.1

yum-config-manager --enable remi-php71  [Default]
yum install php php-common php-fpm
yum install php-mysql php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml php-pecl-apc php-cli php-pear php-pdo

Instale a versão PHP 5.6

yum install php56 php56-php-common php56-php-fpm
yum install php56-php-mysql php56-php-pecl-memcache php56-php-pecl-memcached php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-xml php56-php-pecl-apc php56-php-cli php56-php-pear php56-php-pdo

9. Uma vez instalado o PHP, você pode usar o seguinte comando para verificar a versão padrão do PHP usada em seu servidor.

php -v

Etapa 5: Configurando PHP-FPM e PHP56-PHP-FPM

10. Esta é a parte mais interessante deste tutorial, ela explica como você pode realmente executar múltiplas versões do PHP em seu servidor. Aqui você configurará as diferentes versões do php-fpm com as quais o Nginx irá trabalhar. Você deve definir o usuário/grupo dos processos FastCGI, bem como as portas nas quais eles irão escutar.

Estes são os dois arquivos de configuração a seguir que você irá editar.

  • php-fpm (padrão 7.1) – /etc/php-fpm.d/www.conf
  • php56-php-fpm – /opt/remi/php56/root/etc/php-fpm.d/www.conf

Abra os arquivos acima, defina o usuário/grupo de processos FastCGI.

vi /etc/php-fpm.d/www.conf   [PHP 7.1]
vi /opt/remi/php56/root/etc/php-fpm.d/www.conf  [PHP 5.6] 

Os valores padrão devem ser apache, altere-os para nginx conforme mostrado.

user = nginx
group = nginx

11. Em seguida, encontre os parâmetros de escuta e defina o address:port no qual as solicitações FastCGI serão recebidas.

listen = 127.0.0.1:9000	[php-fpm]
listen = 127.0.0.1:9001	[php56-php-fpm]

12. Depois de concluída toda a configuração acima, você precisa iniciar e habilitar Nginx, MariaDB e PHP-FPM para iniciar automaticamente na inicialização do sistema.

systemctl enable nginx 
systemctl start nginx 

systemctl enable mariadb 
systemctl start mariadb 

---------------- PHP 7.1 ---------------- 
systemctl enable php-fpm 
systemctl start php-fpm 

---------------- PHP 5.6 ----------------
systemctl enable php56-php-fpm 
systemctl start php56-php-fpm 

Atenção: Caso você receba algum erro ao iniciar a segunda instância do PHP, php56-php-fpm, uma política do SELinux pode estar bloqueando desde o início. Se o SELinux estiver no modo de aplicação, configure-o para o modo permissivo e tente iniciar o serviço novamente.

getenforce
setenforce 0 

Etapa 6: configurar sites com permissões

13. Neste ponto, você pode criar os diretórios necessários para seus sites em /var/www/html/. Você também precisa criar diretórios para armazenar logs da seguinte forma:

---------------- Website 1 ----------------
mkdir -p /var/www/html/example1.com/ 
mkdir -p /var/log/nginx/example1.com/ 
 

---------------- Website 2 ----------------
mkdir -p /var/www/html/example2.com/
mkdir -p /var/log/nginx/example2.com/ 

14. Defina as permissões de propriedade apropriadas em todos os diretórios.

---------------- Website 1 ----------------
chown -R root:nginx /var/www/html/example1.com/ 
chmod -R 755 /var/www/html/example1.com/ 
chown -R root:nginx /var/log/nginx/example1.com/
chmod -R 660 /var/log/nginx/example1.com/ 

---------------- Website 2 ----------------
chown -R root:nginx /var/www/html/example2.com/ 
chmod -R 755 /var/www/html/example2.com/
chown -R root:nginx /var/log/nginx/example2.com/ 
chmod -R 660 /var/log/nginx/example2.com/

Etapa 7: configurar blocos de servidor Nginx para sites

15. Agora configure como o Nginx processará as solicitações para seus sites usando os arquivos de configuração do bloco do servidor que devem estar localizados em /etc/nginx/conf.d/.

Crie os arquivos de configuração para seus sites que terminam com a extensão .conf.

vi /etc/nginx/conf.d/example1.com.conf
vi /etc/nginx/conf.d/example2.com.conf

Em seguida, cole as seguintes configurações de bloco de servidor nos respectivos arquivos.

Site 1

server {
        listen 80;
        server_name example1.com www.example1.com;

        root   /var/www/html/example1.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example1.com/example1_access_log;
        error_log   /var/log/nginx/example1.com/example1_error_log   error;

       location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {

                root    /var/www/html/example1.com/;
                fastcgi_pass   127.0.0.1:9000;	#set port for php-fpm to listen on
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
}

Site 2

server {
        listen 80;
        server_name example2.com www.example2.com;

        root    /var/www/html/example2.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example2.com/example2_access_log;
        error_log  /var/log/nginx/example2.com/example2_error_log   error;

       location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {

                root    /var/www/html/example2.com/;
                fastcgi_pass   127.0.0.1:9001;	#set port for php56-php-fpm to listen on
	        fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
}

16. Certifique-se de ter a seguinte linha na parte final do bloco http em /etc/nginx/nginx.conf. Ajuda incluir todos os arquivos de configuração dentro do diretório /etc/nginx/conf.d/ quando o Nginx está em execução.

include /etc/nginx/conf.d/*.conf;

Etapa 8: testando diferentes versões de PHP

17. Finalmente, você precisa testar se seu servidor está usando as duas versões do PHP. Você pode criar um script info.php muito básico nos diretórios raiz dos documentos de seus sites, conforme mostrado.

echo "<?php phpinfo(); ?>" > /var/www/html/example1.com/info.php
echo "<?php phpinfo(); ?>" > /var/www/html/example2.com/info.php

18. Para aplicar todas as alterações feitas acima, você precisa reiniciar o Nginx, php-fpm e php56-php- fpm. Mas você pode primeiro verificar se há erros de sintaxe nos arquivos de configuração do Nginx antes de fazer isso.

nginx -t 
systemctl restart nginx php-fpm php56-php-fpm

19. Há mais uma última coisa a fazer, especialmente se você estiver executando seu servidor localmente, você precisa configurar o DNS local usando o arquivo /etc/hosts conforme mostrado na captura de tela abaixo.

192.168.56.10   example1.com   example1
192.168.56.10   example2.com   example2

20. Por fim, abra um navegador da web e digite os seguintes endereços para verificar as versões do PHP instaladas no sistema.

http://example1.com/index.php
http://example2.com/index.php

É isso! Agora você pode implantar arquivos e testar sites com diferentes versões de PHP. Se você tiver alguma adição a fazer ou perguntas a colocar, use o formulário de comentários abaixo.