Nginx Stream (TCP/UDP) 负载均衡详细说明

Nginx 从 1.9.0 版本开始支持 TCP/UDP 负载均衡,通过 stream 模块实现。stream 模块允许 Nginx 代理和负载均衡 TCP 和 UDP 流量,适用于数据库、邮件服务器、DNS 等非 HTTP 协议的负载均衡。

1. 配置结构

stream 模块的配置与 http 模块类似,主要包含以下几个部分:

  • stream 块:定义 TCP/UDP 负载均衡的全局配置。

  • upstream 块:定义后端服务器组。

  • server 块:定义监听端口和负载均衡策略。

2. 常用指令

  • listen:指定监听的端口和协议(TCP/UDP)。

  • proxy_pass:指定后端服务器组。

  • proxy_timeout:设置代理超时时间。

  • proxy_connect_timeout:设置连接后端服务器的超时时间。

  • proxy_protocol:启用 PROXY 协议。

  • health_check:启用健康检查。

3. 负载均衡策略

  • 轮询(Round Robin):默认策略,按顺序分配请求。

  • 加权轮询(Weighted Round Robin):根据权重分配请求。

  • 最少连接(Least Connections):将请求分配给当前连接数最少的服务器。

  • IP 哈希(IP Hash):根据客户端 IP 分配请求,确保同一客户端始终访问同一服务器。

案例

案例 1:TCP 负载均衡

假设有两台 MySQL 服务器(192.168.1.101 和 192.168.1.102),使用 Nginx 进行 TCP 负载均衡。

stream {
    upstream mysql_backend {
        server 192.168.1.101:3306 weight=2;
        server 192.168.1.102:3306 weight=1;
    }

    server {
        listen 3306;
        proxy_pass mysql_backend;
        proxy_timeout 10s;
        proxy_connect_timeout 5s;
    }
}

案例 2:UDP 负载均衡

假设有两台 DNS 服务器(192.168.1.201 和 192.168.1.202),使用 Nginx 进行 UDP 负载均衡。

stream {
    upstream dns_backend {
        server 192.168.1.201:53;
        server 192.168.1.202:53;
    }

    server {
        listen 53 udp;
        proxy_pass dns_backend;
        proxy_timeout 10s;
        proxy_connect_timeout 5s;
    }
}

案例 3:健康检查

为 TCP 负载均衡添加健康检查。

stream {
    upstream mysql_backend {
        server 192.168.1.101:3306;
        server 192.168.1.102:3306;

        health_check interval=10s passes=2 fails=3;
    }

    server {
        listen 3306;
        proxy_pass mysql_backend;
        proxy_timeout 10s;
        proxy_connect_timeout 5s;
    }
}

总结

Nginx 的 stream 模块为 TCP/UDP 流量提供了强大的负载均衡功能,适用于多种非 HTTP 协议的场景。通过合理配置,可以实现高效、可靠的负载均衡。

本篇文章内容来源于:Nginx Stream(TCP/UDP)负载均衡详细说明以及案例