停止使用PHP-FPM为不同站点重用PHP_VALUE

我注意到以下行为或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_errorsOn

但是如果你再次访问example.net并且这个请求是由同一个worker进行的,你将得到display_errorsOn

所有FPM工作人员都在同一个池中工作。

问:如何使example.net始终使用默认设置?

可能的解决scheme:

  • example.net config中定义PHP_VALUE和所需的设置。
  • 似乎是一个“正确”的解决scheme – 为每个网站创build单独的工作人员池。

但是我们的服务器上有很多网站,这两个解决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脚本,就可以毫不费力地使用同一个工作站来攻击所有其他站点。