一个复杂的 nginx/php-fpm chroot 设置

Rsa*_*sha 5 nginx php-fpm

我正在运行 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 和其他各种组合,但无济于事。

任何人都可以帮忙吗?

Mic*_*ton 2

问题就在这里:

            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.phpSCRIPT_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)