复杂的 nginx/php-fpm chroot 设置

复杂的 nginx/php-fpm chroot 设置

我正在运行 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。

相关内容