Я заметил следующее поведение 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
всегда работать с настройками по умолчанию?
Возможные решения:
PHP_VALUE
с желаемыми настройками в example.net
config тоже.Но на нашем сервере много веб-сайтов, и настройка обоих решений требует много рутинной работы. Мне было интересно, есть ли более простой способ.
Обновить:
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-скрипт, чтобы скомпрометировать ВСЕ другие сайты, которые используют того же рабочего, без каких-либо усилий.