Nginx UDP负载均衡

Nginx 1.9.13开始支持UDP负载匀衡很大程度源于物联网(IoT)。现代应用通常使用多种协议很多核心Internet协议都早于HTTP,支持UDP势在必行。

UDP常用于非事务性的轻量级协议,如:DNS、syslog、RADIUS。这些协议对可靠性没有严格要求,若UDP消息(数据报)丢失,客户端可在超时后重新发送。

UDP配置

# Load balance UDP-based DNS traffic across two servers
stream {
  upstream dns_upstreams {
    server 192.168.136.130:53;
    server 192.168.136.131:53;
  }

  server {
    listen 53 udp;
    proxy_pass dns_upstreams;
    proxy_timeout 1s;
    proxy_responses 1;
    error_log logs/dns.log;
  }
}

NGINX在53端口接收到UDP数据报,使用负载平衡算法(默认:轮询/Round Robin)选择后端服务,等待后端服务响应,并将响应返回客户端。

若后端服务无法响应,NGINX将其标记为“失败”,并暂停向此服务发送数据报。每隔几秒钟,NGINX会向服务器发送较小流量检查服务状态,确认服务是否恢复。

UDP不保证数据的端到端传递,要求客户端能够处理网络级错误和重传。当客户端无法连接到首选服务器时,则必须等待超时才能尝试其他服务器。这会在UDP事务中引入冗长的延迟。

NGINX高可用性和负载平衡可消除或减少此类延迟。客户端将UDP请求发送到NGINX,负载均衡器监视UDP服务器的运行状况和可用性,避免将请求发送到故障或过载服务器。