应先查负载均衡日志和upstream配置确认转发目标,再核对proxy_pass末尾斜杠、后端PATH_INFO解析及直连测试结果。

看 Nginx / Apache 日志里到底转发到了哪台 PHP 后端
404 不一定出在 PHP,很可能是负载均衡把请求发到了一个根本没部署对应路径的后端。先确认真实转发目标:
tail -f /var/log/nginx/access.log | grep "404"或查看
upstream 配置里各 server 的 IP 和端口,再登录对应机器查它的 Web 服务日志(如 /var/log/apache2/error.log 或 /var/log/nginx/error.log)。如果后端日志压根没记录这次请求,说明请求甚至没到它那儿——问题在负载层路由逻辑或健康检查误判。
检查负载均衡的 location 匹配和 proxy_pass 路径拼接
常见错误是 proxy_pass 末尾带不带 / 导致路径错位。比如:
-
location /api/ { proxy_pass http://backend; }→ 请求/api/v1/user会透传为/api/v1/user到后端,但后端可能只监听/v1/user -
location /api/ { proxy_pass http://backend/; }→ 同样请求会变成/v1/user,路径前缀被剥离
PHP 应用若依赖 $_SERVER['REQUEST_URI'] 做路由,这个差异会直接导致框架找不到匹配路由而返回 404。用 curl -v 查响应头中的 X-Forwarded-For 和实际返回内容,比单纯看状态码更可靠。
确认后端 PHP 服务的 DocumentRoot 和 PATH_INFO 解析是否一致
负载均衡后多台机器配置稍有不同,容易漏掉关键项。重点核对:
立即学习“PHP免费学习笔记(深入)”;
- Nginx 的
fastcgi_param SCRIPT_FILENAME是否指向正确的物理路径(比如$document_root$fastcgi_script_name) - 是否开启
fastcgi_split_path_info,且正则能正确拆分index.php/xxx类路径 - Apache 的
AcceptPathInfo是否设为On,尤其用 Laravel/ThinkPHP 这类依赖 PATH_INFO 的框架时 - 所有后端的
open_basedir、disable_functions设置是否一致,避免某台因函数被禁用而无法加载路由文件
用 curl 模拟请求绕过负载均衡直连单台后端
这是最快定位是“负载分发问题”还是“后端本身问题”的方式:
- 从负载机执行:
curl -H "Host: yourdomain.com" http://192.168.1.100/api/test
(替换为真实后端 IP) - 如果直连返回正常,说明问题出在负载层的 rewrite、header 传递(如缺失
Host)、或会话粘滞配置干扰了路径解析 - 如果直连也 404,立刻去那台机器查
phpinfo()输出里的SCRIPT_NAME、PATH_INFO、REQUEST_URI实际值,比猜更有用
负载均衡配错 404 最容易卡在路径重写和后端路径解析这两层之间,日志对不上、curl 直连结果不一致、proxy_pass 尾部斜杠——这三个点反复交叉验证,基本就能锁死问题位置。











