宝塔面板实现负载均衡必须手动在nginx.conf的http块内配置upstream,proxy_pass指向其名称且不加斜杠,重载配置而非重启,并补全proxy_set_header和proxy_next_upstream等关键指令。

宝塔面板默认不提供负载均衡功能,仅靠「反向代理」快捷配置页点几下,proxy_pass 指向单个 IP 就完事了——这根本不是负载均衡,只是单点转发。真要分发流量到多台后端,必须手动写 upstream 块,并确保它被 Nginx 主配置加载,否则配置无效。
upstream 必须放在 nginx.conf 的 http 块里
很多人直接在站点配置文件(如 /www/server/panel/vhost/nginx/xxx.conf)的 server 块里加 upstream,Nginx 启动时会报错:nginx: [emerg] "upstream" directive is not allowed here。
正确位置是主配置文件 /www/server/nginx/conf/nginx.conf 中的 http { } 块内,通常插在 include 语句之前或之后:
http {
upstream my_backend {
server 192.168.1.10:3000 weight=2;
server 192.168.1.11:3000 weight=1;
server 127.0.0.1:8081 backup;
}
include /www/server/panel/vhost/nginx/*.conf;
...
}
- 不能塞进任何
server或location块里,Nginx 语法不认 - 每行
server结尾不要加/,否则路径拼接出错,后端收不到完整 URI - 如果用
backup标记备用节点,它只在其他节点全挂时才启用,不参与常规轮询
proxy_pass 必须指向 upstream 名称,且不带结尾斜杠
在站点配置的 location 块中,proxy_pass 要写成 http://my_backend;,而不是 http://192.168.1.10:3000; 或 http://my_backend/;。
结尾斜杠会触发路径重写逻辑:请求 /api/user 会被改成 /user 发给后端,导致 404。
- 若需保留原始路径前缀(比如只代理
/api/下的请求),才用带斜杠的写法:location /api/ { proxy_pass http://my_backend/; } - 宝塔「反向代理」界面填目标 URL 时,也必须填
http://my_backend(不加斜杠),否则它自动生成的配置会出错 - 改完务必点「重载配置」,不是「重启」——重启可能中断连接,重载能平滑生效
必须补全 proxy_set_header,否则后端拿不到真实信息
宝塔自动生成的反向代理规则默认不设 Host 和 X-Real-IP,后端收到的 Host 可能是 my_backend 这种 upstream 名,Remote-Addr 全是 Nginx 本机 IP,日志、限流、CORS、HTTPS 跳转全乱套。
在 location 块中 proxy_pass 上方,加上这几行:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
-
$host不是$http_host——前者只取域名,后者可能带端口或为空,容易导致后端路由失败 - 若后端是 Node.js(Express/Koa),需显式设
app.set('trust proxy', true)才解析X-Forwarded-For - 这些 header 不能重复写,检查宝塔已生成的规则是否已有部分,避免冲突
健康检查不能只靠 max_fails,得配 proxy_next_upstream
免费版 Nginx 没有主动健康检查,max_fails 和 fail_timeout 只对连接拒绝或超时生效,对后端进程崩溃但端口仍监听的情况完全无感——请求照打,用户看到满屏 502 Bad Gateway。
必须在 location 块中加故障转移策略:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; proxy_next_upstream_tries 3; proxy_next_upstream_timeout 3s;
-
proxy_next_upstream是关键:遇到指定错误就自动试下一个节点,而不是把错误甩给用户 -
proxy_next_upstream_tries限制最多重试几次,避免卡死在某个挂掉的节点上 - 别信宝塔「启用连接池」选项——那只是开
keepalive复用 TCP 连接,和故障转移无关
最容易被忽略的是:所有后端节点必须真实可达,且服务监听的是 0.0.0.0:port 而非 127.0.0.1:port;防火墙、安全组、宝塔自带防火墙都得放行对应端口;改完配置后不重载、只保存,upstream 就永远不生效。


















