You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx UDP负载均衡异常:请求始终仅转发至单台后端服务器

解决Nginx UDP负载均衡流量仅转发至单台后端的问题

这问题我之前帮朋友排查过,其实是Nginx Stream模块对UDP请求的默认会话保持机制在搞鬼!默认情况下,Nginx会给UDP请求用源IP哈希的调度逻辑——简单说就是同一个客户端IP发的所有UDP请求,都会被绑定到同一台后端服务器,所以你测试的时候才会看到流量全走第一台,只有删掉它才会切换到第二台。

下面给你几个可行的解决办法:

1. 显式指定负载均衡算法

直接在upstream块里明确写你想要的调度策略,覆盖默认的源IP绑定行为:

比如用轮询(最常用的策略,每个请求依次分配给不同后端):

upstream radius_loadbalance {
    round_robin; # 显式开启轮询
    server 123.456.789.123:1813;
    server 123.456.789.124:1813;
    server 123.456.789.125:1813;
}

要是你想优先把请求发给连接数最少的后端,就把round_robin换成least_conn就行。

2. 调整会话保持的哈希规则(如果需要会话绑定)

如果你的业务确实需要会话一致性(比如某些RADIUS场景),但又想让负载均衡生效,可以修改哈希的依据,比如结合源IP和端口——这样同一个客户端用不同端口发请求时,会分配到不同后端:

upstream radius_loadbalance {
    hash $remote_addr$remote_port; # 用IP+端口做哈希键
    server 123.456.789.123:1813;
    server 123.456.789.124:1813;
    server 123.456.789.125:1813;
}

3. 验证配置并重启Nginx

改完配置后先检查有没有语法错误:

nginx -t

要是输出“test is successful”,就重启Nginx让配置生效:

systemctl restart nginx

补充说明下原因

为啥会这样?因为UDP是无连接协议,Nginx默认会通过源IP来识别同一个“会话”,把同一IP的请求都发去同一后端,避免负载均衡导致的会话中断。但如果你只用单客户端测试,就会看起来像负载均衡没起作用——这其实是Nginx的默认保护机制,不是bug。


内容的提问来源于stack exchange,提问作者Sachith Muhandiram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:55:23