用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 

并更改了nginxconfiguration:

 #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给我一个任何PHP脚本的File not found消息。 查看错误日志,我可以看到它预先传递给传递给fastcgi的DOCUMENT_ROOTvariables的rootpath,所以我尝试在位置块中覆盖它,如下所示:

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

但是我仍然得到相同的错误,并且debugging日志显示发送到PHP-FPM的完整,未连接的path。

我错过了什么让这个工作?

看起来你忘了一个/

 fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name; 

应该读:

 fastcgi_param SCRIPT_FILENAME /www/public$fastcgi_script_name; 

我有同样的情况,这是我的愿望:

fpmconfiguration:

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

nginxconfiguration:

  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 

Nginx不知道你是否已经在你的PHP-FPM上设置了chroot。 所以,你仍然需要提供fastcgi_param中的完整path。 基本上,你最初的configuration是你需要的。