Ubuntu16.04下Apache2+PHP-FPM Socket单域名Chroot配置脚本找不到问题
这个问题我之前帮客户处理过,核心原因是Chroot环境下路径映射不匹配——Nginx传递给PHP-FPM的是主机系统的绝对路径,但Chroot里的PHP进程只能看到自己隔离环境内的路径,自然找不到非首页的脚本。给你一步步梳理解决方法:
当你硬写index.php时,刚好命中了Chroot内部的路径,但访问其他页面时,Nginx默认传递的是主机上的完整路径(比如/var/www/example.com/chroot/var/www/html/about.php),而Chroot里的PHP看不到主机的/var/www/example.com/chroot目录,只会去寻找/var/www/example.com/chroot/var/www/html/about.php(这在Chroot内部是不存在的,因为Chroot的根就是/var/www/example.com/chroot),所以返回“File not found.”。
1. 修正Nginx的FastCGI参数(关键!)
在你的域名Nginx配置的PHP处理location块里,必须把SCRIPT_FILENAME设置为Chroot内部的绝对路径,而不是主机的路径。
假设你的配置是:
- 主机上的Chroot目录:
/var/www/example.com/chroot - Chroot内部的网站根目录:
/var/www/html(对应主机路径/var/www/example.com/chroot/var/www/html)
那Nginx的location配置应该写成:
location ~ \.php$ { # 指向该域名专属的PHP-FPM Socket fastcgi_pass unix:/var/run/php/php7.0-fpm-example.com.sock; fastcgi_index index.php; # 核心:用Chroot内部的路径替代主机路径 fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; # Chroot内的文档根目录 fastcgi_param DOCUMENT_ROOT /var/www/html; # 以下是必要的FastCGI参数,确保请求信息正确传递 fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; }
2. 确认PHP-FPM Pool的Chroot配置正确
打开该域名对应的PHP-FPM Pool配置文件(通常在/etc/php/7.0/fpm/pool.d/example.com.conf),确保以下参数设置正确:
[example.com] user = www-data group = www-data listen = /var/run/php/php7.0-fpm-example.com.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 # 关键:设置Chroot路径 chroot = /var/www/example.com/chroot # Chroot内部的工作目录(网站根目录) chdir = /var/www/html pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
3. 检查Chroot内部的文件权限
确保Chroot内的网站文件和目录权限正确,让PHP-FPM的运行用户(默认是www-data)能读取:
# 递归设置目录权限 chmod -R 755 /var/www/example.com/chroot/var/www/html # 递归设置文件权限 chmod -R 644 /var/www/example.com/chroot/var/www/html/* # 设置所有者 chown -R www-data:www-data /var/www/example.com/chroot/var/www/html
4. 重启服务生效
修改配置后,重启Nginx和PHP-FPM服务:
systemctl restart nginx systemctl restart php7.0-fpm
访问http://yourdomain.com/about.php(或其他非首页PHP脚本),如果能正常加载,说明配置正确。如果还是报错,可以查看PHP-FPM的日志(/var/log/php7.0-fpm.log)和Nginx的错误日志(/var/log/nginx/error.log),里面会有更详细的路径错误提示。
内容的提问来源于stack exchange,提问作者LetynSOFT

