Apache + PHP-FPM + chroot 结果“文件未找到。”错误

Apache + PHP-FPM + chroot 结果“文件未找到。”错误

我想使用 PHP-FPM 池的 chroot 属性将 chroot 设置为 DocumentRoot。使用以下设置,无论我做什么,都只会收到“文件未找到”错误:

/etc/php5/fpm/pool.d/example.conf

[example]
user = example
group = example
listen = /var/run/php_fpm_example.sock
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = /opt/jail/example/home/example
php_admin_value[open_basedir]=/opt/jail/example/home/example

/etc/apache2/sites-enabled/示例

<VirtualHost *:80>
ServerName example.domain.name
ServerAlias www.example.domain.name
DocumentRoot /opt/jail/example/home/example
<Directory /opt/jail/example/home/example>
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler php-script
</FilesMatch>
Action php-script /php5-fpm-handler
Alias /php5-fpm-handler /vhost_example
FastCGIExternalServer /vhost_example -socket /var/run/php_fpm_example.sock
</IfModule>
</VirtualHost>

所以网站本身位于 /opt/jail/example/home/example。你可能觉得奇怪,但没关系,这是 jailkit 造成的。

感谢您的帮助。

答案1

PHP 在 chroot jail 内运行。因此,一旦你设置了此项:

chroot = /opt/jail/example/home/example

然后该路径/opt/jail/example/home/example就变成了 PHP 的路径/。因此,这是没有意义的:

php_admin_value[open_basedir]=/opt/jail/example/home/example

因为 PHP 不再有权访问 /opt/jail/example.... 因为它位于根路径之外。

您还没有发布它,但您还需要对 fastcgi_param 配置文件进行更改,在其中设置参数,SCRIPT_FILENAME它可能如下所示:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

需要将其更改为类似以下内容:

fastcgi_param  SCRIPT_FILENAME    webroot/$fastcgi_script_name;

chroot如果您将++的值组合起来,则webroot可以获得$fastcgi_script_name磁盘上文件的绝对路径。由于 PHP 在 chroot 中运行,因此您无需将其包含在路径中。

顺便说一句,更好的做法是将 chroot 设置为高于 webroot 的级别,这样您的应用程序可以写入 chroot 内但不在 webroot 中的日志文件,这样用户就无法意外下载它们。

因此你的目录将是:

/opt/jail/example/home/          <-- chroot
/opt/jail/example/home/example   <-- Read only directory is exposed as webroot (or document root).
/opt/jail/example/home/var/log   <-- Writeable directory that holds log files.  

相关内容