在四层 TCP/UDP 负载均衡场景下,HAProxy 通常在健康检查粒度和连接管理上更专业;Nginx 则胜在生态整合,适合同时需要静态资源或七层处理的场景。
核心结论:两者均支持四层负载均衡,但实现机制不同。HAProxy 原生支持四层,功能更专注;Nginx 需启用 stream 模块,优势在于配置统一。
- 选型建议:纯四层流量转发、复杂健康检查选 HAProxy;需要混合七层服务、配置简化选 Nginx
- 关键差异:Nginx 四层需编译 stream 模块,HAProxy 默认支持;HAProxy 四层健康检查更灵活
- 注意事项:Nginx 配置修改需 reload,HAProxy 支持软停止;两者均受系统文件描述符限制
环境检查与模块确认
部署前务必确认软件版本及模块支持情况,避免配置生效失败。
nginx -V 2>&1 | grep `--with-stream` # 确认 Nginx 是否包含 stream 模块
haproxy -v # 查看 HAProxy 版本及编译选项
ss -tlnp | grep -E '80|443|8080' # 检查端口占用情况
若 Nginx 输出中无`--with-stream`,则无法配置四层负载均衡,需重新编译或安装 nginx-plus 版本。
四层负载均衡配置示例
HAProxy 配置(mode tcp)
HAProxy 原生支持四层,需明确指定mode tcp,健康检查默认基于 TCP 连接状态。
global
log /dev/log local0
maxconn 4096
defaults
mode tcp
timeout connect 5s
timeout client 50s
timeout server 50s
frontend tcp_front
bind *:8080
default_backend tcp_back
backend tcp_back
balance roundrobin
option tcp-check # 可选,用于更复杂的 TCP 健康检查
server web1 192.168.1.10:80 check inter 3000 fall 3 rise 2
server web2 192.168.1.11:80 check inter 3000 fall 3 rise 2
Nginx 配置(stream 块)
Nginx 四层配置必须包裹在stream上下文中,且不能与http块混用同一配置文件(除非 include)。
stream {
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
listen 8080;
proxy_pass backend;
proxy_connect_timeout 1s;
proxy_timeout 3s;
}
}
验证与排查步骤
1. 配置语法检查
nginx -t # 检查 Nginx 配置
haproxy -c -f /etc/haproxy/haproxy.cfg # 检查 HAProxy 配置
2. 连通性测试
使用telnet或nc模拟 TCP 连接,验证负载均衡是否转发。
nc -vz 192.168.1.100 8080 # 测试 LB IP 端口连通性
telnet 192.168.1.100 8080 # 手动建立连接观察后端响应
3. 故障切换验证
手动停止一台后端服务(如systemctl stop nginx在后端服务器),观察 LB 日志。HAProxy 默认需探测失败fall次后标记下线,Nginx 基于fail_timeout判定。
4. 日志监控
tail -f /var/log/haproxy.log # HAProxy 日志
tail -f /var/log/nginx/error.log # Nginx 错误日志,关注 upstream 连接错误
常见技术坑与风险
- Nginx 模块缺失:多数发行版默认 Nginx 不包含 stream 模块,直接配置
stream {}会报错unknown directive。 - 健康检查误区:HAProxy 在
mode tcp下使用option httpchk会导致协议不匹配,纯四层场景应依赖 TCP 连接检查或option tcp-check。 - 连接数限制:两者高并发均受限于系统
ulimit -n,生产环境建议调整至 65535 以上。 - Nginx reload 风险:Nginx 修改 stream 配置 reload 时,旧 worker 会处理完现有连接,若长连接过多可能导致新配置生效延迟。