在高并发反向代理场景下,Nginx 胜在功能综合(Web+ 代理),HAProxy 胜在专业负载均衡算法和稳定性。纯流量转发且需要精细健康检查时 HAProxy 更合适,Web 业务综合处理选 Nginx。
先说结论:两者都能扛高并发,但定位不同。Nginx 是 Web 服务器兼代理(支持 HTTP/TCP),HAProxy 是专业代理服务器。
- 适合:HTTP/HTTPS 综合业务选 Nginx,纯 TCP/HTTP 负载均衡且需要复杂算法选 HAProxy
- 重点看:Nginx 支持 7 层正则分流及 Stream 模块 TCP 代理,HAProxy 支持 4 层和 7 层且会话保持功能更专业
- 别忽略:HAProxy 健康检查有探测间隔,故障切换可能存在延迟,需配置合理参数
核心架构与协议支持
Nginx 设计初衷是高性能 HTTP 服务器,采用事件驱动架构。早期版本主要支持 HTTP,但新版通过 stream 模块也支持 TCP/UDP 代理,不过在复杂 TCP 负载均衡功能上 HAProxy 仍更专业。HAProxy 则是专注于负载均衡和代理的软件,支持四层和七层转发,在会话保持和动态权重调整上功能更丰富。
配置实操:Nginx Stream 模块
若需 Nginx 处理 TCP 负载均衡,需编译启用 stream 模块。配置示例如下:
stream {
upstream backend {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
server {
listen 3306;
proxy_pass backend;
proxy_connect_timeout 1s;
}
}
配置实操:HAProxy 健康检查
HAProxy 支持更细粒度的健康检查,包括 HTTP 状态码探测。配置示例:
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 192.168.1.10:80 check inter 2s fall 3 rise 2
server web2 192.168.1.11:80 check inter 2s fall 3 rise 2
参数说明:inter 2s 表示探测间隔 2 秒,fall 3 表示连续 3 次失败才标记下线,rise 2 表示连续 2 次成功标记上线。
验证方法与命令
使用抓包工具分析流量分布。在测试机上运行 tcpdump 监听端口,观察请求是否均衡分发到后端。
tcpdump -i eth0 -nn port 80 | grep -E "192.168.1.10|192.168.1.11"
对于健康检查,可以模拟后端故障,观察前端请求是否还会往挂掉的机器转发。注意 HAProxy 可能需要探测三次才会把故障节点切下线。
高并发参数调优
在高并发场景下,除了软件配置,还需调整系统内核参数:
- 文件句柄数:
ulimit -n 65535 - 端口复用:
sysctl -w net.ipv4.tcp_tw_reuse=1 - 连接队列:
sysctl -w net.core.somaxconn=65535
常见坑与排查
1. 健康检查延迟:HAProxy 配置探测间隔后,若后端机器挂掉且未达到探测时间点,请求还会往挂掉的机器转发,可能导致请求丢失。
2. 协议支持误区:Nginx 并非仅支持 HTTP,通过 stream 模块支持 TCP/UDP 代理,但配置复杂度略高于 HAProxy 的原生 TCP 支持。
3. 配置复杂度:HAProxy 配置文件相对复杂,需要一定的学习成本,而 Nginx 配置相对简洁。