nginx轮询负载均衡不生效或报502、“no live upstreams”,首要排查upstream是否正确定义在http块内,名称与proxy_pass严格一致,且配置已实际加载生效。

如果 Nginx 轮询负载均衡不生效,甚至报错 502 或 “no live upstreams”,首先要排查 upstream 块是否真的被正确加载——很多问题表面是后端不可用,根源其实是 upstream 根本没定义成功。
检查 upstream 是否在 http 块内定义
upstream 指令只能出现在 http { } 上下文中,不能放在 server、location 甚至 include 的裸文件里。常见错误包括:
- 把 upstream 写在 server { } 块内部,Nginx 启动时会报 "unknown directive 'upstream'" 或 "upstream directive is not allowed here"
- 用 include 引入 upstream 配置,但被 include 的文件没有包裹在 http { } 中,只是单独一个 upstream backend { ... },这会导致语法解析失败
- 配置分散在多个 conf 文件中,但主 nginx.conf 里未启用对应 include(如注释了 include /etc/nginx/conf.d/*.conf)
验证 upstream 名称与 proxy_pass 是否完全一致
proxy_pass 后的地址必须是 协议 + 斜杠 + upstream 名称,且名称大小写、拼写、空格都要严格匹配:
- ✅ 正确:
proxy_pass http://backend;(对应upstream backend { ... }) - ❌ 错误:
proxy_pass http://Backend;(大小写不一致) - ❌ 错误:
proxy_pass http://backend/;(末尾斜杠会触发 URI 重写,可能破坏路径,且部分版本会静默忽略 upstream 查找) - ❌ 错误:
proxy_pass http://backend:80;(upstream 里没写端口时加 :80 会强制走 DNS 解析,失败则无法识别 upstream)
确认 Nginx 实际加载的配置中是否存在该 upstream
不要只看编辑的文件,要查 Nginx 真正读到的是什么:
- 执行 nginx -t:它会校验语法并列出所有已加载的配置文件路径,注意输出末尾是否有 warning 提示某文件被跳过或包含错误
- 执行 nginx -T(大写 T):输出全部生效的完整配置,搜索
upstream backend {,确认它确实出现在 http 块内、且结构完整(server 行末有分号、无多余符号) - 检查 error.log:启动或 reload 后若出现 "no live upstreams",说明 upstream 被识别了,但所有节点都被标记为 down;若出现 "invalid URL prefix" 或 "no resolver defined",往往指向 proxy_pass 写法或 DNS 相关问题,而非 upstream 缺失
排除配置未生效的典型干扰项
有些现象看似 upstream 缺失,实则是其他环节阻断:
- upstream 里用了
localhost,而系统 hosts 或 DNS 解析慢或失败,导致 Nginx 认为该 server 不可达(建议统一用127.0.0.1或真实 IP) - 后端服务监听在非标准端口(如 3000),但 upstream 中漏写了端口号:
server 192.168.1.10;默认连 80,应写成server 192.168.1.10:3000; - 配置修改后未执行 nginx -s reload 或 systemctl reload nginx,仍运行旧配置











