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证书。
正向代理:替客户端访问外网(梯子那种,禁止使用)
反向代理:用户访问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证书。