nginx反向代理需正确定义upstream于http块内,并在location中配合proxy_pass及关键proxy_set_header指令(如host、x-real-ip、x-forwarded-proto),同时校验语法、确认配置生效后reload,否则易引发502、会话丢失等问题。

直接在 location 块里用 proxy_pass 指向 upstream 名称,就能把流量分发过去——但光写这一行远远不够,容易导致 502、会话丢失、IP 识别错误或 HTTPS 跳转异常。
必须写对 upstream 定义位置
upstream 块不能放在 server 或 location 里,必须定义在 http 全局作用域下(通常在 /etc/nginx/nginx.conf 或宝塔的 /www/server/panel/vhost/nginx/proxy.conf 等被主配置 include 的文件中):
- 检查当前生效的配置路径:运行
nginx -V 2>&1 | grep conf-path,确认主配置是否包含你修改的文件 - 宝塔用户建议统一写在
/www/server/panel/vhost/nginx/proxy.conf(该文件默认被 include),避免改了没生效 - 示例正确结构:
http {
upstream my_backend {
server 192.168.1.10:8000 weight=2;
server 192.168.1.11:8000;
server 127.0.0.1:8001 backup;
}
server {
listen 80;
location / {
proxy_pass http://my_backend;
}
}
}
proxy_pass 后必须补全关键代理头
proxy_pass http://my_backend; 只是转发地址,后端服务要靠这些 header 才能正确识别请求来源和客户端信息:
-
proxy_set_header Host $host;—— 不加这行,后端收到的 Host 是 IP(如 192.168.1.10),静态资源 404、多站点路由、SSO 登录都会失败 -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;—— 保证后端拿到真实客户端 IP,用于限流、日志审计 -
proxy_set_header X-Forwarded-Proto $scheme;—— 让后端知道是 HTTP 还是 HTTPS,避免强制跳转出错 - 这些指令必须写在
proxy_pass之前,且不能重复——宝塔自动生成的反向代理规则可能已含部分,需手动检查去重
按业务选对负载均衡算法
upstream 内部加一行指令,就能切换分发逻辑:
- 轮询(默认):不加额外指令,适合性能相近的无状态服务
- 加权轮询:
server 192.168.1.10:8000 weight=3;—— 高配机器承担更多流量 - 会话保持:
ip_hash;放在 upstream 开头 —— 同一 IP 始终打到同一台后端,适用于未做共享 session 的老系统 - 最少连接:
least_conn;—— 适合长连接或响应时间差异大的场景 - 健康检查依赖被动机制:每台 server 可加
max_fails=3 fail_timeout=30s,Nginx 在连续失败后自动剔除节点(注意:开源版无主动探针)
改完务必验证再 reload
别跳过这步,很多 502 就卡在这儿:
- 执行
nginx -t检查语法,确认输出 “syntax is ok” 和 “test is successful” - 用
nginx -T查看最终合并后的完整配置,确认 upstream 名称拼写一致、proxy_pass 地址可解析、没有重复的 proxy_set_header - reload 服务:
systemctl reload nginx(非 restart,避免中断已有连接) - 简单验证:curl -I 域名,观察响应头中的 Server 字段是否来自不同后端,或查看后端 access.log 的访问 IP 分布











