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

Ole*_*leg 5 php nginx php.ini 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

/srv/www/i.php文件:

<?php phpinfo();
Run Code Online (Sandbox Code Playgroud)

如您所见,唯一的区别是fastcgi_param PHP_VALUE "display_errors=1";.

现在,如果你杀死所有FPM工人,并打开example.net第一个,你会看到display_errorsOff预期。在example.com您将看到display_errorsOn

但是,如果你访问example.net再次这个请求是由同一工作的进行,你会得到display_errorsOn

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

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

可能的解决方案:

  • PHP_VALUEexample.netconfig 中也使用所需的设置进行定义。
  • 似乎是一个“正确”的解决方案 - 为每个站点创建单独的工作人员池。

但是我们的服务器上有很多网站,这两种解决方案都意味着需要进行大量日常工作。我想知道是否有更简单的方法。

更新:

display_errors选择我的示例中的设置只是为了演示问题。任何php.ini设置都会发生相同的情况。根据评论,在单个服务器上混合生产和开发站点是一个坏主意。

Dan*_*iel 9

发生这种情况的原因很可能是“通过 php_value 或 php_flag 传递的 PHP 设置将覆盖它们以前的值”,如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 脚本即可危及使用同一工作器的所有其他站点,无需任何努力。