nginx自1.9.0起通过stream模块支持udp负载均衡,适用于dns、ntp等场景;需编译启用--with-stream,配置中使用stream上下文、udp监听、health_check udp=yes及proxy_responses等关键参数。

Nginx 从 1.9.0 版本起通过 stream 模块支持 UDP 负载均衡,适用于 DNS、NTP 等无连接、低延迟的关键服务。配置核心在于启用 stream 上下文、声明 UDP upstream 组、设置监听与代理行为,并注意 UDP 特有的参数(如响应等待、健康检查)。下面分关键环节说明。
启用 stream 模块并创建顶层配置
Nginx 默认不加载 stream 模块,需确认编译时已启用(--with-stream),并在主配置文件(如 /etc/nginx/nginx.conf)的 全局层级 添加 stream{...} 块,不能放在 http 块内:
- 确保配置文件开头有
load_module modules/ngx_stream_module.so;(路径依实际安装而定) - 在
events块之后、http块之前添加:stream {<br> # 后续 upstream 和 server 配置放在这里<br>}
定义 UDP upstream 组(以 DNS 为例)
upstream 组指定后端服务器列表及调度策略。UDP 场景常用 least_conn(连接数最少)或默认轮询;权重、备用节点、健康检查均可配置:
-
least_conn更适合 DNS 查询这种短连接、高并发场景,避免某台服务器积压请求 - 健康检查需显式开启并设为 UDP 类型:
health_check udp=yes type=dns interval=5s fails=2 passes=1; - 示例:
upstream dns_servers {<br> least_conn;<br> server 10.0.0.20:53 weight=3;<br> server 10.0.0.21:53 backup;<br> health_check udp=yes type=dns interval=5s fails=2 passes=1;<br>}
配置 UDP 监听与代理转发
server 块中使用 listen 53 udp; 明确启用 UDP 协议;proxy_pass 指向 upstream 名称;关键参数控制行为逻辑:
-
proxy_responses 1:表示期望上游返回 1 个响应包(DNS 查询典型值),超时前只等这个数 -
proxy_timeout 30s:整个事务(发送+等待响应)最大耗时,建议设为略大于后端 DNS 解析超时(如 bind 默认 30s) -
proxy_bind可选:若 Nginx 有多网卡,用它指定出站源 IP,便于后端 ACL 控制 - 示例:
server {<br> listen 53 udp;<br> proxy_pass dns_servers;<br> proxy_responses 1;<br> proxy_timeout 30s;<br> access_log /var/log/nginx/dns_udp.log udp_log;<br>}
日志与调试注意事项
UDP 日志格式需单独定义,因无连接状态,传统 $remote_addr 等变量不可用;推荐使用 $protocol、$status、$session_time 等 stream 变量:
- 在 stream 块外(如 main 级)定义日志格式:
log_format udp_log '$remote_addr:$remote_port -> $server_addr:$server_port ' '$protocol $status $bytes_sent $bytes_received $session_time'; - UDP 不支持 keepalive 或重传,失败即丢包,因此健康检查和
proxy_responses设置直接影响可用性 - NTP 服务可复用相同结构,仅需改端口为
123 udp、type=ntp,且通常设proxy_responses 0(NTP 客户端不等待响应)











