You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:35:05