Nginx Round-Robin轮询未严格交替请求问题咨询
Nginx Round-Robin轮询未严格交替请求的原因分析
你遇到的这个情况其实是Nginx默认轮询策略结合连接复用机制导致的,并非配置错误,下面给你拆解具体原因:
连接复用(Keepalive)的核心影响
Nginx默认会和上游服务器建立长连接,同时像wget这类主流客户端工具现在也默认启用了Keepalive。如果客户端和Nginx保持同一个长连接,那么该连接内发送的所有请求都会被Nginx转发到同一台上游服务器。比如你连续执行多次wget时,若工具复用了和Nginx的长连接,这些请求就会全部落到同一台machine上,直到连接断开才会切换到下一台。轮询粒度是连接而非单个请求
默认的Round-Robin策略是为每个新的客户端连接分配下一个上游服务器,而非为每个单独的请求分配。也就是说,只要客户端保持同一个连接,不管发多少请求,都会走同一台上游。只有当客户端新建一个连接时,Nginx才会切换到轮询列表里的下一台服务器。上游响应速度的微小差异
即使没有连接复用,如果某台上游服务器的响应速度比另一台快一点点,它会更快地回到Nginx的可用服务器池中,此时若刚好有新请求进来,就可能被优先分配给这台服务器,出现连续请求的情况。不过这种情况只会偶尔发生,整体请求比例还是会维持在接近50/50的水平,和你描述的现象一致。
验证方法
你可以试试用关闭Keepalive参数的请求工具测试,比如用curl:
curl --no-keepalive http://localhost
多执行几次,应该就能看到请求严格交替分配到两台上游服务器了。
内容的提问来源于stack exchange,提问作者jsrz
相关产品推荐
相关产品推荐

