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_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_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 脚本即可危及使用同一工作器的所有其他站点,无需任何努力。
归档时间: |
|
查看次数: |
3023 次 |
最近记录: |