Múltiplas versões do PHP através do nginx

3

EDITAR: Para referência futura

Estou executando o Ubuntu 14.10 com uma pilha LEMP usando o PHP 5.5.12. Eu tenho um número de sites WordPress legados que requerem PHP 5.3.3 ao lado de alguns sites WP que usam uma versão bastante recente do PHP, todos rodando em nginx na minha máquina local .

Minhas mãos estão amarradas em relação a máquinas virtuais e sandboxes, tudo o que posso jogar é o nginx, daí a questão. Eu entendo as preocupações de segurança das pessoas, mas eu preciso que esses sites sejam executados localmente para que eu possa testar os recursos quebrados enquanto os atualizo para as versões mais recentes do PHP / WP.

Eu quero que o nginx execute a versão correta do PHP (usando php-fpm) dependendo do site do WordPress. De acordo com outra pergunta do SF, Uma maneira de conseguir isso é ter as diferentes versões do PHP sendo executadas em portas / soquetes separados e configurar os blocos do servidor nginx para usar a respectiva porta / soquete.

Eu compilei o PHP 5.3.3 manualmente para incluir o php-fpm, mas isso é o mais distante que eu tenho.

Efetivamente, quero que alguém explique com um pouco mais de detalhes esta resposta. Não consigo descobrir como "executar cada versão do php-fpm em uma porta (ou soquete) diferente" ou "configurar a porta apropriada em seu parâmetro fastcgi_pass em seu servidor nginx bloco ".

Um dos meus blocos de servidores é assim para referência

server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

EDITAR:

Eu configurei cada site usando um bloco de servidor separado em um arquivo separado, sym vinculado entre /var/nginx/sites-available/testsite1 e /var/nginx/sites-enabled/testsite1 . Então var/nginx/sites-available contém;

 testsite1
 testsite2
 testsite3
 ...

Então idealmente eu queria saber se algo como o que está abaixo é possível (já que isso é similar a como o apache pode ser configurado com diferentes versões do PHP)

testsite1 - executando uma versão mais antiga do PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    ...settings to use older PHP version...

    ...remaining nginx settings...
}

testsite2 - executando a versão atual do PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite2;
    index index.php index.html index.htm;

    server_name local.testsite2.com;

    ...settings to use currrent PHP version (if needed)...

    ...remaining nginx settings...
}

Isso é possível? O motivo pelo qual eu pergunto é que eu preferiria evitar renomear todos os meus arquivos php para php2 para executar (tornando o controle de versão um problema). Eu não me importo de editar o arquivo nginx.conf ou qualquer passo que seja necessário, desde que eu não precise renomear arquivos.

Eu também acredito eu preciso usar soquetes (fastcgi_pass unix:/var/run/php5-fpm.sock;) em portas devido ao WordPress (embora eu esteja aberto a todas as sugestões).

    
por myol 25.02.2015 / 20:09

2 respostas

11

Ok, você quer rodar múltiplas versões do PHP através do nginx, o arquivo de configuração deve inclui o caminho específico onde você coloca seus scripts PHP em diferentes versões ou nomes de extensão.

No entanto, gostaria de explicar o link da pergunta do SF no seu post.

Essa resposta está dando a você uma maneira de modificar o conf de seu nginx , o que pressupõe que o questionador tenha experiência em nginx .

Ao fornecer uma porta específica em conf , o nginx fará com que o script seja executado através desse canal FastCGI.

Vamos fingir que você instalou uma versão diferente do PHP em seu servidor, e você modificou o port em php-fpm.conf .

Você deseja que todo o arquivo php executado na versão 5.5.0 e php2 arquivo seja executado em 5.6.0 .

Exemplo de configuração do nginx da seguinte forma,

    listen       8080;
    server_name  localhost;

    root   html;

    location / {
        index  index.php index.php2;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

    location ~ \.php2$ {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

Nesse caso, php é processado pela porta 9000 e php2 vai para 9001

Este é apenas um exemplo simples, para avançados, você pode criar duas pastas diferentes para armazenar arquivos php, por exemplo, /home/php55 e /home/php56 e, em seguida, editar seu nginx.conf .

PARA SUA PERGUNTA EDITADA

Se você quiser adicionar servidores diferentes para processar os scripts em versões diferentes, certifique-se de fazer isso, pois o nginx pode ser um balanceador de carga e também pode lidar com esse tipo de problema.

Primeiro aplicativo

server{
listen 80;
server_name php1.localhost; 

root   /home/www/php5.5;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9002; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Segundo aplicativo

server{
listen 80;
server_name php2.localhost; 

root   /home/www/php5.6;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9004; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Usando a configuração acima, você pode facilmente mudar o resultado da versão diferente do script PHP, além disso, você pode usar o NFS (se você estiver em um ambiente * nix) para montar o disco, neste caso, você não precisará para colocar arquivos em duas pastas manualmente.

Quanto ao método de passagem Fastcgi, sugiro usar PORT em vez de Socket.

Todos nós sabemos que o Unix Socket tem um desempenho melhor devido à porta TCP usar toda a pilha de rede, mesmo na mesma máquina.

No entanto, o tempo que você economiza é muito pequeno, além disso, você pode enfrentar esse problema ao usar o Socket em um tempo de tráfego alto,

connect() to unix:/var/run/php5-fpm.sock failed or apr_socket_recv: Connection reset by peer (104)

Além disso, a porta TCP pode fornecer uma maneira mais rápida de gerenciar se você colocar o nginx e o php-fpm em servidores separados.

Estou usando um laptop pequeno para editar este post, então os códigos não são bonitos, mas eu tentei ....

EDITADO

Lembre-se de modificar seu /etc/hosts para corresponder ao seu nome de host (nome_do_servidor em nginx.conf )

    
por 27.02.2015 / 11:26
5

Para fins de teste, eu queria configurar o meu nginx para usar diferentes versões do php em diferentes locais na mesma seção do servidor. Finalmente, funcionou com isso:

#Folder to run some tests with the new php-7
location ~ "^\/test_php7.0.3\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php7-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#Folder to run some tests with a custom compiled version of php5.6
location ~ "^\/test_php5.6.18\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php56-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#The default php version:
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Espero que isso ajude alguém:)

    
por 15.02.2016 / 11:38