我想使用 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.