1. Nginx四层负载均衡与Stream模块核心解析
在分布式系统架构中,负载均衡技术如同交通指挥中心,而Nginx的Stream模块就是专门处理TCP/UDP流量的"交警大队"。与常见的七层(HTTP/HTTPS)负载均衡不同,四层负载均衡工作在OSI模型的传输层,直接基于IP地址和端口进行流量分发。这种工作模式使其特别适合以下场景:
- 数据库读写分离(如MySQL主从集群)
- 自定义协议服务代理(如游戏服务器)
- 实时通信系统(如WebSocket长连接)
- 邮件服务(SMTP/POP3/IMAP)
关键区别:七层负载均衡能解析应用层协议内容(如HTTP头),而四层负载均衡仅看到原始数据包,这种"盲转发"特性带来更低延迟,但牺牲了协议感知能力。
2. Stream模块配置全流程实战
2.1 基础环境准备
首先确认Nginx版本支持Stream模块:
nginx -V 2>&1 | grep -o with-stream若未显示输出,需要重新编译安装:
./configure --with-stream make && make install2.2 核心配置模板解析
在nginx.conf的main上下文添加:
stream { upstream backend { server 192.168.1.10:3306 weight=5; # MySQL主库 server 192.168.1.11:3306 weight=3; # 从库1 server 192.168.1.12:3306 backup; # 备用库 } server { listen 3307; proxy_pass backend; proxy_connect_timeout 3s; proxy_timeout 1h; } }2.3 高级参数详解
| 参数 | 作用 | 推荐值 | 注意事项 |
|---|---|---|---|
| proxy_buffer_size | 每个连接内存缓冲区 | 4k-16k | 大并发需调小 |
| proxy_protocol | 传递客户端IP | on/off | 需后端服务支持 |
| proxy_ssl | SSL终端卸载 | on/off | 需证书配置 |
| health_check | 健康检查 | interval=5s | 增加系统负载 |
3. 生产环境调优策略
3.1 连接池优化
对于数据库类长连接服务,建议添加以下配置:
proxy_next_upstream on; proxy_next_upstream_timeout 0; proxy_next_upstream_tries 0;3.2 多worker负载均衡
在stream上下文中添加:
worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 20480; multi_accept on; }3.3 内核参数调优
# 增加本地端口范围 echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf # 提高TCP缓冲区 echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf sysctl -p4. 典型问题排查指南
4.1 连接失败排查流程
- 检查Nginx错误日志:
tail -f /var/log/nginx/error.log - 测试后端连通性:
nc -zv 192.168.1.10 3306 - 验证防火墙规则:
iptables -L -n | grep 3306
4.2 性能瓶颈分析
使用系统工具定位问题:
# 查看TCP连接状态 ss -ant | awk '{print $1}' | sort | uniq -c # 监控Nginx worker负载 top -p $(pgrep -d',' nginx)5. 安全加固方案
5.1 访问控制列表
server { listen 3307; allow 10.0.0.0/8; deny all; proxy_pass backend; }5.2 SSL终端加密
server { listen 3307 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; proxy_pass backend; }在实际部署中,我们发现当并发连接超过5000时,Linux内核的TIME_WAIT状态连接会占用大量资源。解决方案是在Nginx和客户端之间部署LVS进行连接复用,同时调整内核参数:
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf