【问题标题】:nginx passing request to incorrect php-fpm poolnginx 将请求传递给不正确的 php-fpm 池
【发布时间】:2018-10-04 09:13:28
【问题描述】:

有一台机器,上面有nginxphp-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;

【问题讨论】:

    标签: php nginx chroot fpm


    【解决方案1】:

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

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

    通过我发现的 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

    【讨论】:

    • 谢谢你,路德维希!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多