我正在运行 nginx 和 php-fpm,我想为每个主机设置监狱。我的设置有点复杂,所以按照网上的教程我一无所获。
每个站点都有一个目录 /var/www/domain.name/
在该目录中,将有一个 public/ 目录作为网站根目录,一个 logs/ 目录将专门存储该站点的 nginx 日志,以及 chroot 文件系统(etc/、usr/ 等)
我遇到的第一个问题是,无论我如何配置它,PHP-FPM 都找不到通过 nginx 传递给它的文件。它们导致“主脚本未知”错误,更糟糕的是,来自 PHP-FPM 的错误消息并不比这更冗长,所以我无法弄清楚 nginx 正在传递什么路径。
主机的 php-fpm 池配置如下所示:
[host]
user = host
group = www-data
chroot = /var/www/domain.name
chdir = /public
listen = 127.0.0.1:900x
Run Code Online (Sandbox Code Playgroud)
'x' 为每个池增加。
该主机的 nginx 配置如下所示:
server
{
listen 80;
server_name domain.name *.domain.name;
root /var/www/domain.name/public;
index index.php index.html index.html;
location ~ \.php$
{
expires epoch;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9001;
}
}
Run Code Online (Sandbox Code Playgroud)
我猜测问题出在 SCRIPT_FILENAME 参数上,但我已将其更改为 $fastcgi_script_name 和其他各种组合,但无济于事。
任何人都可以帮忙吗?
问题就在这里:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Run Code Online (Sandbox Code Playgroud)
您的 PHP 运行在 chroot 中/var/www/domain.name
,但您的文档根目录是/var/www/domain.name/public
. 所以当你加载时/index.php
就SCRIPT_FILENAME
变成了/var/www/domain.name/public/index.php
. 但是,在 chroot 中这并不存在!相反,它是在/public/index.php
。
您可以做的是更改此处的目录,使其与 chroot 中的视图匹配:
fastcgi_param SCRIPT_FILENAME /public$fastcgi_script_name;
Run Code Online (Sandbox Code Playgroud)