Pare de reutilizar PHP_VALUE para sites diferentes com PHP-FPM

3

Eu notei o seguinte comportamento ou PHP-FPM:

Veja estas duas configurações do Nginx:

server {
    listen         80;
    server_name    example.com;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /srv/www/i.php;
        fastcgi_param PHP_VALUE "display_errors=1";
        include fastcgi_params;
    }
}
server { 
    listen         80;
    server_name    example.net;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /srv/www/i.php;
        include fastcgi_params;
    }
}

e /srv/www/i.php file:

<?php phpinfo();

Como você pode ver, a única diferença é fastcgi_param PHP_VALUE "display_errors=1"; .

Agora, se você matar todos os trabalhadores do FPM e abrir example.net primeiro, verá display_errors is Off como esperado. E em example.com você verá display_errors is On .

Mas se você visitar example.net novamente e essa solicitação será realizada pelo mesmo trabalhador, você receberá display_errors as On .

Todos os trabalhadores do FPM estão trabalhando no mesmo pool.

Pergunta: como fazer com que example.net funcione sempre com as configurações padrão?

Soluções possíveis:

  • Defina PHP_VALUE com as configurações desejadas em example.net config também.
  • Parece ser uma solução "certa" - crie pools separados de trabalhadores para cada site.

Mas nós temos muitos sites em nosso servidor, e ambas as soluções significam muito trabalho de rotina para configurar. Eu queria saber se existe um jeito mais fácil.

Atualização:

A configuração

display_errors no meu exemplo foi escolhida apenas para demonstrar o problema. A mesma situação ocorre com qualquer configuração php.ini . Conforme os comentários, é uma má ideia misturar sites de produção e desenvolvimento em um único servidor.

    
por Oleg 25.11.2016 / 10:48

1 resposta

6

A razão pela qual isso acontece é mais provável que "configurações do PHP passadas com php_value ou php_flag sobrescreverão seu valor anterior", como descrito documentação do PHP-FPM .

Eu assumo que na sua configuração do PHP display_errors está desativado. Em seguida, você visita a página .net, na qual seu phpinfo() confirma que está desativado.

Em seguida, você visita a página .com e o Nginx passa display_errors=1 para o seu funcionário do PHP-FPM no mesmo pool. Isso substitui o valor anterior de 0 pelo novo valor 1 . Você pode confirmar isso com phpinfo() .

Agora as configurações do pool PHP-FPM estão definidas para display_errors=1 .

Quando você visita a página .net novamente, phpinfo() confirma que display_errors=1 foi sobrescrito quando Nginx passou o valor de 1 para o mesmo pool que agora lida com outro de seus sites.

A solução é mover o desenvolvimento para outro servidor, conforme sugerido nos comentários. Ou para criar um pool PHP-FPM dedicado para o seu site, que é o mínimo que você deve fazer.

Bônus:

E, por favor, não faça isso na configuração do Nginx: fastcgi_param PHP_VALUE "display_errors=1";

Isso deve estar no arquivo de configuração do php, preferencialmente na própria configuração do pool fpm do site.

But we have a lot of websites on our server, and both solutions mean a lot of routine work to set up. I was wondering if there is an easier way.

Você pode usar o prefixo por pool para uma correção rápida. Em qualquer caso, colocar vários sites em um único pool de trabalho é uma má ideia, porque eu preciso apenas que um de seus sites execute um script php malicioso para comprometer TODOS os outros sites que usam o mesmo worker, sem nenhum esforço. / p>     

por 30.11.2016 / 14:36