服务器运维 发布于 2026-11-05 18:26

Nginx反向代理、缓冲区、502报错深度排查与优化笔记

一、反向代理是什么

正向代理:替客户端访问外网(梯子那种,禁止使用)
反向代理:用户访问Nginx,Nginx把请求转发给后端服务(PHP-FPM、Node、其他后端接口),用户感知不到后端真实服务地址。
我们宝塔里的网站,本质就是Nginx反向代理转发请求给PHP-FPM进程。

二、proxy_pass 路径大坑(高频踩坑)

 proxy_pass  末尾带  /  和不带  /  是完全两种逻辑:
示例:# 不带/
location /api {
proxy_pass http://127.0.0.1:8080;
}
# 访问 /api/test → 转发到 http://127.0.0.1:8080/api/test

# 带/
location /api {
proxy_pass http://127.0.0.1:8080/;
}
# 访问 /api/test → 转发到 http://127.0.0.1:8080/test

很多接口404,根源就是这里路径匹配理解错误。
三、Nginx缓冲区 proxy_buffering
缓冲区是Nginx把后端返回内容先缓存,缓存完一次性返回浏览器。
示例:proxy_buffering off;
proxy_set_header X-Accel-Buffering no;

也就是上一篇SSE笔记里提到的关键配置,缓冲区开启会直接把流式推送堵住。

四、502 Bad Gateway 排查思路
502 = Nginx成功收到请求,但是转发给后端的时候,后端没有正常返回响应。
排查顺序:

1. 查看Nginx错误日志 /www/wwwlogs/nginx_error.log
​
2. 检查PHP-FPM是否正常启动,进程是否耗尽
​
3. 查看php-fpm.conf 进程数量、最大内存限制
​
4. 脚本执行超时,php.ini max_execution_time 过小
​
5. 后端地址端口写错、服务宕机、端口监听127.0.0.1外部无法访问

区分:504 Gateway Timeout 是超时,502是连接失败/程序崩溃。

五、请求头透传配置
反向代理默认不会把客户端真实IP、Host传递给后端,需要手动携带:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

后端PHP通过  $_SERVER['HTTP_X_REAL_IP']  获取访客真实IP。

六、学习总结

1. proxy_pass 斜杠问题是新手最高频出错点;
​
2. 流输出场景必须关闭代理缓冲;
​
3. 遇到502优先看日志,不要盲目重启;
​
4. 反向代理适合做负载均衡、隐藏后端服务、统一SSL证书。