应先查负载均衡日志和upstream配置确认转发目标,再核对proxy_pass末尾斜杠、后端PATH_INFO解析及直连测试结果。
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)。如果后端日志压根没记录这次请求,说明请求甚至没到它那儿——问题在负载层路由逻辑或健康检查误判。
常见错误是 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 和实际返回内容,比单纯看状态码更可靠。
负载均衡后多台机器配置稍有不同,容易漏掉关键项。重点核对:
fastcgi_param SCRIPT_FILENAME 是否指向正确的物理路径(比如 $document_root$fastcgi_script_name)fastcgi_split_path_info,且正则能正确拆分 index.php/xxx 类路径AcceptPathInfo 是否设为 On,尤其用 Laravel/ThinkPHP 这类依赖 PATH_INFO 的框架时open_basedir、disable_functions 设置是否一致,避免某台因函数被禁用而无法加载路由文件这是最快定位是“负载分发问题”还是“后端本身问题”的方式:
curl -H "Host: yourdomain.com" http://192.168.1.100/api/test(替换为真实后端 IP)
Host)、或会话粘滞配置干扰了路径解析phpinfo() 输出里的 SCRIPT_NAME、PATH_INFO、REQUEST_URI 实际值,比猜更有用负载均衡配错 404 最容易卡在路径重写和后端路径解析这两层之间,日志对不上、curl 直连结果不一致、proxy_pass 尾部斜杠——这三个点反复交叉验证,基本就能锁死问题位置。