Назад | Перейти на главную страницу

Прекратите повторно использовать PHP_VALUE для разных сайтов с PHP-FPM

Я заметил следующее поведение PHP-FPM:

Взгляните на эти две конфигурации 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;
    }
}

и /srv/www/i.php файл:

<?php phpinfo();

Как видите, единственная разница в том, fastcgi_param PHP_VALUE "display_errors=1";.

Теперь, если вы убьете всех рабочих FPM и откроете example.net сначала вы увидите display_errors является Off как и ожидалось. И в example.com ты увидишь display_errors является On.

Но если вы посетите example.net очередной раз и этот запрос обрабатывается тем же работником, вы получите display_errors так как On.

Все воркеры FPM работают в одном пуле.

Вопрос: как сделать example.net всегда работать с настройками по умолчанию?

Возможные решения:

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

Обновить:

display_errors Настройка в моем примере была выбрана только для демонстрации проблемы. Такая же ситуация с любыми php.ini настройка. Согласно комментариям, совмещать производственные и разрабатываемые сайты на одном сервере - плохая идея.

Причина, по которой это происходит, скорее всего, заключается в том, что «настройки 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-скрипт, чтобы скомпрометировать ВСЕ другие сайты, которые используют того же рабочего, без каких-либо усилий.