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:
PHP_VALUE
with the desired settings in example.net
config as well.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.
Причина это случается, скорее всего, что «настройки 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]