宝塔面板不支持负载均衡图形界面,upstream必须定义在nginx.conf的http块内,proxy_pass需指向upstream名称且不带结尾斜杠,并补全proxy_set_header透传真实信息,重载配置前须验证后端连通性。

宝塔面板本身不提供负载均衡图形界面,所有多服务器分发必须手动配置 upstream 块并联动 proxy_pass,否则点再多“反向代理”按钮也只是单点转发。
upstream 必须写在 nginx.conf 的 http 块里
很多人直接在站点配置文件(如 /www/server/panel/vhost/nginx/xxx.conf)的 server 块里加 upstream,Nginx 启动时会报错:nginx: [emerg] "upstream" directive is not allowed here。
-
upstream只能在http { }块内定义,不能出现在server或location里 - 正确位置是主配置文件
/www/server/nginx/conf/nginx.conf中的http { }内部,通常插在include语句之前或之后 - 示例写法(注意缩进和分号):
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; }
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 $host不要写成$http_host——后者可能带端口或为空,不稳定 - 如果后端是 Node.js(Express/Koa),需显式设置
app.set('trust proxy', true),否则不解析这些头
重载配置而非重启,且要验证后端连通性
改完配置不等于生效。Nginx 进程必须加载新配置,且所有后端服务得真实可通,否则 502 满天飞。
- 保存后必须点「重载配置」,不是「重启」——重启会中断连接,重载是平滑生效
- 操作前先在宝塔服务器上执行:
curl -I http://192.168.1.10:3000和curl -I http://192.168.1.11:3000,确保都能返回 200 - 启用故障转移需加
proxy_next_upstream:proxy_next_upstream error timeout http_500 http_502 http_503 http_504; proxy_next_upstream_tries 3; proxy_next_upstream_timeout 3s;
- 健康检查模块(如
nginx_upstream_check_module)宝塔默认不带,需手动编译;没它就只能靠被动检查(max_fails/fail_timeout)
最容易被忽略的是 upstream 的作用域位置和 proxy_pass 的结尾斜杠——这两处写错,整个负载均衡就形同虚设,流量永远只打到一台机器上。











