nginx 将请求传递给不正确的 php-fpm 池
nginx passing request to incorrect php-fpm pool
有一台机器上有nginx和php-fpm。有 2 台服务器、2 php-fpm 池(每个都有 chroot)和 2 个目录 具有相同的结构和类似的 files/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;
有同样的问题。
到目前为止,关于这个问题的最佳答案是 ServerFault,它建议 opcache.enable=0
,这让我看到了 PHP.
的一个非常有趣的行为
the APC/OPcache cache is shared between all PHP-FPM pools
进一步挖掘我发现的 opcache 文档 this php.ini
option:
opcache.validate_root=1
opcache.validate_root boolean
Prevents name collisions in chroot'ed environments. This should be enabled in all chroot'ed environments to prevent access to files outside the chroot.
将此选项设置为 1
(默认为 0
)并重新启动 php-fpm
解决了我的问题。
编辑:
搜索正确的词 (validate_root
) 我发现了更多关于这个错误的信息:
根据错误讨论的说明,您还应该考虑设置 opcache.validate_permission=1
有一台机器上有nginx和php-fpm。有 2 台服务器、2 php-fpm 池(每个都有 chroot)和 2 个目录 具有相同的结构和类似的 files/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;
有同样的问题。
到目前为止,关于这个问题的最佳答案是 ServerFault,它建议 opcache.enable=0
,这让我看到了 PHP.
the APC/OPcache cache is shared between all PHP-FPM pools
进一步挖掘我发现的 opcache 文档 this php.ini
option:
opcache.validate_root=1
opcache.validate_root boolean
Prevents name collisions in chroot'ed environments. This should be enabled in all chroot'ed environments to prevent access to files outside the chroot.
将此选项设置为 1
(默认为 0
)并重新启动 php-fpm
解决了我的问题。
编辑:
搜索正确的词 (validate_root
) 我发现了更多关于这个错误的信息:
根据错误讨论的说明,您还应该考虑设置 opcache.validate_permission=1