现在我们在一个 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 故障排除
必须在每个 nginx 虚拟主机中重新定义路径,并使用 fastcgi_param 传递给 php-fpm
fastcgi.conf 已经有了 SCRIPT_FILENAME、DOCUMENT_ROOT 的定义,所以指令必须位于 include 后面。DOCUMENT_ROOT 默认值是 nginx virtualhost root !!
fastcgi_pass 必须是 ip:port 而不是 socket(在 chroot 中不可用)(将 listen=9000 添加到池配置)
使用 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