我正在运行 nginx 和 php-fpm,我想为每个主机设置 jail。我的设置有点复杂,所以按照网上的教程做也无济于事。
每个站点都有一个目录 /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
每个池的“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;
}
}
我猜测问题出在 SCRIPT_FILENAME 参数上,但我已将其更改为 $fastcgi_script_name 以及其他各种组合,但都无济于事。
有人可以帮忙吗?
答案1
问题在于:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
您的 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;
答案2
可行的方法是在 nginx conf 中设置:
root /public;
我试过这个,可以工作,但如果你要连接 mysql db,那就根本行不通。这也是我的局限性,虽然可以工作,但由于套接字问题,无法连接到 mysql db。