Stop reusing PHP_VALUE for different sites with PHP-FPM

I noticed the following behavior or PHP-FPM:

Take a look at these two Nginx configs:

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;
    }
}

and /srv/www/i.php file:

<?php phpinfo();

As you can see the only difference is fastcgi_param PHP_VALUE "display_errors=1";.

Now if you kill all FPM workers, and open example.net first, you will see display_errors is Off as expected. And at example.com you will see display_errors is On.

But if you visit example.net again and this request is proceeded by the same worker, you will get display_errors as On.

All FPM workers are working in the same pool.

Question: how to make example.net always work with default settings?

Possible solutions:

  • Define PHP_VALUE with the desired settings in example.net config as well.
  • Seems to be a "right" solution - create separate pools of workers for each 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.

Update:

display_errors setting in my example was chosen just to demonstrate the problem. The same situation takes place with any php.ini setting. As per comments, it is a bad idea to mix production and development sites on a single server.

3
задан 1 December 2016 в 11:03
1 ответ

Причина это случается, скорее всего, что «настройки PHP, переданные с php_value или php_flag, перезапишут свое предыдущее значение», как описано в документации PHP-FPM .

Я предполагаю, что в вашей конфигурации PHP display_errors выключен. Затем вы посещаете .net-страницу, на которой ваш phpinfo () подтверждает, что он отключен.

Затем вы посещаете .com-страницу, и Nginx передает display_errors = 1 вашему работнику PHP-FPM в том же пуле. Это перезаписывает предыдущее значение 0 новым значением 1 . Вы можете подтвердить это с помощью phpinfo () .

Теперь настройки пула PHP-FPM установлены на display_errors = 1 .

При повторном посещении страницы .net , phpinfo () действительно подтверждает, что display_errors = 1 , потому что он был перезаписан, когда Nginx передал значение 1 в тот же пул, который теперь обрабатывает другой из ваших веб-сайтов. .

Решение состоит в том, чтобы перенести разработку на другой сервер, как предлагается в комментариях. Или создать выделенный пул PHP-FPM для вашего сайта, что минимум, что вам следует сделать.

Бонус:

И, пожалуйста, не делайте этого в своей конфигурации Nginx: fastcgi_param PHP_VALUE "display_errors = 1 ";

Это должно быть в файле конфигурации php, желательно в конфигурации собственного пула fpm сайта.

Но на нашем сервере много веб-сайтов, и оба решения означают много рутинной работы по настройке . Мне было интересно, есть ли более простой способ.

Вы можете использовать префикс для каждого пула для быстрого исправления. В любом случае размещение нескольких сайтов в одном рабочем пуле - плохая идея, потому что мне нужно только заставить один из ваших сайтов выполнить мой вредоносный php-скрипт, чтобы скомпрометировать ВСЕ другие сайты, которые используют того же рабочего, без каких-либо усилий. 1139716]

7
ответ дан 3 December 2019 в 05:11

Теги

Похожие вопросы