PHP-FPM chroot-所有 nginx 虚拟主机的一个池

PHP-FPM chroot-所有 nginx 虚拟主机的一个池

现在我们在一个 php-fpm 池下有多个虚拟主机 (nginx)。我们希望以相同的方式使用它chroot

Chroot 指令是绝对路径/var/www,但chdir应该/[domain]/httpdocs

是否可以从 nginx 传递一些变量(例如$domain)以便以chdir=/$domain/httpdocs类似的方式使用它$pool

答案1

最后我终于明白了。

nginx 虚拟主机配置

root /chroot/var/www/domain.com/httpdocs;
...

location ~ ^/[^/]+\.php$
{
  try_files $uri =404;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;

  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;

  include fastcgi.conf;

  fastcgi_param  SCRIPT_FILENAME /var/www/domain.com/httpdocs$fastcgi_script_name;
  fastcgi_param  DOCUMENT_ROOT   /var/www/domain.com/httpdocs;
}

池配置

chroot = /chroot
chdir = 

PHP-FPM chroot 故障排除

  1. 必须在每个 nginx 虚拟主机中重新定义路径,并使用 fastcgi_param 传递给 php-fpm

  2. fastcgi.conf 已经有了 SCRIPT_FILENAME、DOCUMENT_ROOT 的定义,所以指令必须位于 include 后面。DOCUMENT_ROOT 默认值是 nginx virtualhost root !!

  3. fastcgi_pass 必须是 ip:port 而不是 socket(在 chroot 中不可用)(将 listen=9000 添加到池配置)

  4. 使用 nginx more headers 模块进行调试,查看响应头中的变量(debian 软件包 libnginx-mod-http-headers-more-filter

     more_set_headers    "x-debug-header: $document_root";
    

与 PHP-FPM chroot 相关的并发症

  • 解析域名
  • 时区
  • 邮件()
  • SSL 流
  • imagick 模块

https://knzl.at/setting-up-a-chroot-for-php/ https://gist.github.com/nikitasius/7ff0de91e314d955f4e66c76a5c47bf2

相关内容