nginx将请求传递到不正确的php-fpm池

时间:2018-10-04 09:13:29

标签: php nginx chroot fpm

有一台装有 nginx php-fpm 的计算机。有 2个服务器 2个php-fpm池(每个池都带有chroot)和 2个目录,它们具有相同的结构和类似的文件/ php课程。

一个池在127.0.0.1:22333上监听,而另一个在127.0.0.1:22335上监听。 问题是,当我向第二台服务器发出请求时,它在第一个池中以某种方式执行。更奇怪的是,有时它需要从一个目录(第一个池的目录)中获取一些PHP类,有时又从另一个目录中获取。没有特定的模式,似乎是随机发生的。

例如:Nginx日志显示请求到达第二个服务器,而php-fpm日志显示该请求在第一个池中处理。

但这从来没有发生过(对第一个服务器的请求始终在第一个php-fpm池中执行)

池的设置方式相同:

same user
same group
pm = dynamic
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 300
chroot = ...
chdir = /

php_flag[display_errors] = on
php_admin_value[error_log] = /logs/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 64M
catch_workers_output = yes
php_admin_value[upload_tmp_dir] = ...
php_admin_value[curl.cainfo] = ...

用于php的Nginx服务器指令如下:

fastcgi_pass 127.0.0.1:2233X;
fastcgi_index  index.php;
include /etc/nginx/fastcgi_params;

fastcgi_param DOCUMENT_ROOT    /;
fastcgi_param SCRIPT_FILENAME  $fastcgi_script_name;
fastcgi_param PATH_INFO        $fastcgi_script_name;
fastcgi_intercept_errors       off;

1 个答案:

答案 0 :(得分:1)

有同样的问题。 到目前为止,最好的答案是在ServerFault上,它提出了opcache.enable=0,这向我指出了PHP的一种非常有趣的行为。

  

所有PHP-FPM池之间共享APC / OPcache缓存

深入研究opcache文档,发现this php.ini option

opcache.validate_root=1
  

opcache.validate_root boolean

     

防止在chroot环境中发生名称冲突。应该在所有chroot环境中启用此功能,以防止访问chroot以外的文件。

将此选项设置为1(默认为0)并重新启动php-fpm对我来说解决了这个问题。

编辑: 搜索正确的单词(validate_root),我发现了有关此错误的更多信息:

在错误讨论之后,您还应该考虑设置opcache.validate_permission=1