以下是一个关于Nginx实现TCP/UDP负载均衡的详细配置示例,涵盖基础配置、高级功能及运维方案:
一、基础TCP负载均衡配置(以MySQL为例)
# 主配置文件 nginx.conf
worker_processes auto;
events {
worker_connections 65535;
use epoll; # Linux高效事件模型
}
stream {
# 定义TCP服务组(MySQL 3306端口)
upstream mysql_servers {
zone tcp_servers 64k; # 共享内存区(用于状态监控)
server 192.168.1.100:3306 weight=5; # 主节点
server 192.168.1.101:3306 weight=3; # 备节点
server 192.168.1.102:3306 backup; # 应急节点
# 健康检查配置
health_check interval=10s # 每10秒检查一次
fails=3 # 连续失败3次标记为不可用
passes=2 # 需连续成功2次恢复可用
port=3306; # 自定义健康检查端口
}
# TCP服务监听
server {
listen 3306;
proxy_pass mysql_servers;
proxy_timeout 60s; # 全局超时时间
proxy_connect_timeout 5s; # 连接建立超时
# 会话保持(基于客户端IP)
hash $remote_addr consistent; # 一致性哈希算法
}
# 访问控制示例
server {
listen 6379; # Redis服务
proxy_pass redis_servers;
allow 192.168.1.0/24; # 允许内网访问
deny all; # 拒绝其他IP
}
}
二、UDP负载均衡配置(以DNS为例)
stream {
# 定义UDP服务组(DNS 53端口)
upstream dns_servers {
server 10.0.0.20:53 weight=5;
server 10.0.0.21:53 weight=3;
# UDP健康检查配置
health_check udp=yes # 声明为UDP检查
type=dns # 检查类型为DNS
interval=5s # 检查间隔
fails=2 # 失败阈值
passes=1; # 恢复阈值
}
# UDP服务监听
server {
listen 53 udp; # 关键参数:指定UDP协议
proxy_pass dns_servers;
proxy_timeout 30s;
proxy_responses 1; # 期望响应数(DNS查询通常为1)
# 访问日志配置
access_log /var/log/nginx/dns_access.log udp_log;
}
}
三、高级功能配置
1. SSL/TLS终止(TCP+SSL场景)
stream {
upstream secure_service {
server 172.16.0.10:8443;
server 172.16.0.11:8443;
}
server {
listen 443 ssl;
ssl_preread on; # 启用SSL预读
ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256;
proxy_pass secure_service;
proxy_protocol on; # 启用PROXY协议传递客户端信息
}
}
2. 负载均衡算法优化
stream {
# 最少连接算法(动态选择)
upstream l4_loadbalancer {
least_conn; # 覆盖默认轮询算法
server 10.0.0.30:8080;
server 10.0.0.31:8080;
}
# 加权轮询(静态权重)
upstream weighted_servers {
server 10.0.0.40:8080 weight=3;
server 10.0.0.41:8080 weight=1;
}
}
3. 流量镜像(调试场景)
stream {
upstream main_service {
server 10.0.0.50:8080;
}
server {
listen 8080;
proxy_pass main_service;
# 流量镜像配置
mirror /dev/null; # 丢弃镜像流量
mirror_request_body on; # 镜像请求体
}
}
四、监控与维护配置
1. 实时状态监控
stream {
server {
listen 8080;
proxy_pass tcp_status_server;
location /stream_status {
# 自定义TCP状态页(需Lua模块)
content_by_lua_block {
local connections = ngx.shared.tcp_connections
ngx.say("Active connections: ", connections.active)
ngx.say("Total connections: ", connections.total)
}
allow 192.168.1.0/24;
deny all;
}
}
}
2. 详细日志记录
stream {
log_format tcp_log '$remote_addr [$time_local] '
'$protocol $status $session_time '
'$bytes_sent $bytes_received';
access_log /var/log/nginx/tcp_access.log tcp_log;
}
五、性能调优建议
-
内核参数优化
# 调整TCP参数 sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sysctl -w net.ipv4.tcp_fin_timeout=30 sysctl -w net.ipv4.tcp_tw_reuse=1
-
Nginx配置优化
- 调整
worker_connections
匹配业务需求 - 启用
multi_accept on
批量接受连接 - 对高频服务配置
reuseport
参数(需Linux 3.9+)
- 调整
-
连接管理
- 使用
so_keepalive=on
启用TCP Keepalive - 配置
proxy_timeout
合理值防止连接泄漏
- 使用
六、测试与验证
-
TCP服务测试
# 使用mysql客户端测试 mysql -h nginx_ip -P 3306 -u user -p # 使用nc工具测试 nc -vz nginx_ip 3306
-
UDP服务测试
# 使用dig命令测试DNS dig @nginx_ip example.com # 使用nc工具测试UDP echo "test" | nc -u nginx_ip 53
-
实时监控
# 观察TCP连接状态 ss -s | grep tcp # 分析访问日志 awk '{print $4}' /var/log/nginx/tcp_access.log | sort | uniq -c
七、注意事项
- 模块依赖:确保Nginx编译时包含
--with-stream
参数 - 协议特性:UDP为无状态协议,需业务层实现会话保持
- 防火墙配置:开放TCP/UDP端口(注意云服务商安全组规则)
- 日志轮转:配置
logrotate
定期切割stream模块日志
该配置示例实现了四层负载均衡的核心功能,可根据实际需求扩展以下方向:
- 集成Consul/Etcd实现服务发现
- 配置动态DNS解析(通过
resolver
指令) - 实现全局负载均衡(结合GeoIP模块)
- 添加DDoS防护(通过
limit_conn
/limit_rate
指令)
建议通过专业测试工具(如tcpreplay、iperf)验证配置效果,并结合监控系统(Prometheus+Grafana)构建完整监控体系。