使用 nginx chrooting php-fpm

使用 nginx chrooting php-fpm

我正在使用 PHP 5.3.9 和 nginx 设置新服务器,因此我使用 php-fpm SAPI 选项编译了 PHP。使用 nginx 中的以下服务器条目,它本身运行良好:

server {
    listen 80;
    server_name domain.com www.domain.com;

    root /var/www/clients/domain.com/www/public;
    index index.php;

    log_format gzip '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"';
    access_log /var/www/clients/domain.com/logs/www-access.log;
    error_log /var/www/clients/domain.com/logs/www-error.log error;

    location ~\.php$ {
            fastcgi_pass 127.0.0.1:9001;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /var/www/clients/domain.com/www/public$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }
}

它能很好地处理我的 PHP 文件。为了增加安全性,我想 chroot 我的 FPM 实例,因此我向此 FPM 实例的 conf 文件中添加了以下几行:

# FPM config
chroot = /var/www/clients/domain.com

并改变了 nginx 配置:

#nginx config for chroot
location ~\.php$ {
            fastcgi_pass 127.0.0.1:9001;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }

经过这些更改,nginx 会向我发送File not found有关任何 PHP 脚本的消息。查看错误日志,我可以看到它将root路径添加到传递给 fastcgi 的 DOCUMENT_ROOT 变量的前面,因此我尝试在位置块中覆盖它,如下所示:

fastcgi_param DOCUMENT_ROOT /www/public/;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

但我仍然收到相同的错误,并且调试日志显示发送到 PHP-FPM 的完整、非根路径。

我缺少什么才能让它工作?

答案1

我遇到了同样的情况,这是我的解决方案:

fpm 配置:

prefix = /var/www/example.com
chroot = $prefix
chdir = /
listen = tmp/php5-fpm.sock
slowlog = log/$pool.log.slow

nginx配置:

 location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/www/example.com/tmp/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /htdocs$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT /htdocs;
 }

/var/www/example.com 的文件夹结构

drwxr-x---  6 www-data www-data 4096 May 22 10:57 .
drwxr-xr-x 10 root     root     4096 May 22 08:52 ..
drwxr-x---  2 www-data www-data 4096 May 22 10:57 htdocs
drwxr-x---  2 www-data www-data 4096 May 22 10:34 log
drwxr-x---  2 www-data www-data 4096 May 22 10:56 tmp

答案2

看起来你忘了一个/

fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;

应该读:

fastcgi_param SCRIPT_FILENAME /www/public$fastcgi_script_name;

答案3

Nginx 不知道您是否在 PHP-FPM 上设置了 chroot。因此,您仍然需要在 fastcgi_param 中提供完整路径。基本上,您的初始配置就是您所需要的。

相关内容