我注意到以下行为或PHP-FPM:
看看这两个Nginx的configuration:
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 , 并且这个请求是由同一个worker进行的,你将得到display_errors为On 。
所有FPM工作人员都在同一个池中工作。
问:如何使example.net始终使用默认设置?
可能的解决scheme:
example.net config中定义PHP_VALUE和所需的设置。 但是我们的服务器上有很多网站,这两个解决scheme都意味着很多日常的工作。 我想知道是否有一个更简单的方法。
更新:
我的示例中的display_errors设置只是为了演示问题。 任何php.ini设置都会发生同样的情况。 根据评论,在一台服务器上混合生产和开发网站是一个坏主意。
发生这种情况的原因很可能是“php_value或php_flag传递的PHP设置将覆盖以前的值”,如PHP-FPM文档所述 。
我假设在你的PHPconfiguration中, display_errors是禁用的。 然后你访问.net页面,其中你的phpinfo()确认它被禁用。
然后,您访问.com页面,Nginx将display_errors=1传递给您在同一个池中的PHP-FPM worker。 用新值1覆盖之前的值0 。 你可以用phpinfo()来确认。
现在,PHP-FPM池设置被设置为display_errors=1 。
当您再次访问.net页面时, phpinfo()确实会确认display_errors=1因为当Nginx将值1传递给现在处理另一个网站的相同池时,它将被覆盖。
正如评论中所build议的那样,解决scheme是将开发移到另一台服务器上。 或者为您的网站创build一个专用的PHP-FPM池,这是您最不应该做的。
奖金:
请不要在你的Nginxconfiguration中做这个: fastcgi_param PHP_VALUE "display_errors=1";
这应该是在PHPconfiguration文件,最好在网站自己的FPM池configuration。
但是我们的服务器上有很多网站,这两个解决scheme都意味着很多日常的工作。 我想知道是否有一个更简单的方法。
您可以使用每个池前缀来快速修复。 在任何情况下,将多个站点放在一个单独的工作池中是一个坏主意,因为我只需要让您的一个站点执行一个恶意的PHP脚本,就可以毫不费力地使用同一个工作站来攻击所有其他站点。