为什么 Nginx 加权轮询转发会出现死循环
nginx 的加权轮询(weighted round robin)本身不会导致死循环,出现该现象通常是因为上游服务器配置了错误的 `proxy_pass` 地址,形成了自引用或环路。排查时请检查 `upstream` 块中定义的服务器 ip 是否指向了 nginx 自身,或者反向代理的目标地址是否错误地包含了当前 nginx 实例。

server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_pool;
}
}
upstream backend_pool {
# 错误示例:如果这里填的是 Nginx 自身的 IP 或 localhost
# 请求会发回给 Nginx,Nginx 再次匹配规则并转发,形成死循环
server 127.0.0.1:8080 weight=5;
server 192.168.1.100:8080 weight=3;
}
在上面的配置中,如果 127.0.0.1:8080 实际上是 Nginx 监听的另一个端口或同一端口的不同虚拟主机,且没有正确的终止条件,就会发生循环。确保 upstream 中的服务器是真正的后端应用服务器,而不是 Nginx 自己。
如何定位具体的环路节点
要定位环路,需要查看 Nginx 的错误日志,通常会报 upstream prematurely closed connection 或 connect() failed (111: Connection refused) 等错误,但更直接的是通过 curl -v 观察响应头中的 Location 或检查后端服务的访问日志。如果后端服务也做了反向代理,需确认其目标地址是否正确。

# 使用 curl 模拟请求并跟踪重定向或连接情况 curl -v http://example.com/ # 或者在后端服务器上查看 access.log # 如果看到大量来自 Nginx IP 的请求,且 URL 相同,则可能存在环路
在实际操作中,可以通过 tcpdump 或 netstat 监控 Nginx 与后端之间的网络连接。如果发现 Nginx 不断向某个地址发送请求,而该地址又立即返回请求给 Nginx,即可确认为环路。此外,检查后端应用的配置,确保其没有将未知请求重定向回 Nginx。
基于 upstream 权重配置的具体问题
当 upstream 中配置的服务器权重之和不为零,但所有服务器都不可用时,Nginx 会尝试将所有请求发送给第一个可用的服务器,如果该服务器也处于故障状态,可能会导致请求堆积或超时,但这不是死循环。死循环的根本原因还是在于地址配置的逻辑错误。例如,如果 weight 设置不当,可能导致负载不均,但不会引起循环。只有当路由逻辑形成闭环时,才会出现死循环。











