深色模式
负载均衡对比 LVS/HAProxy/Nginx
摘要:选型先懂区别。本文一句话讲清 LVS / HAProxy / Nginx 各自在哪层、适合什么,然后动手配一段最常用、最易懂的 Nginx 反向代理。
适用环境
bash
# 以 Nginx 实操为例
which nginx || sudo apt install nginx
nginx -v
sudo ss -lntp | grep ':80'1
2
3
4
2
3
4
操作步骤
1. 三者定位速览
| 组件 | 工作层 | 特点 | 适合场景 |
|---|---|---|---|
| LVS | 四层(IP/端口) | 内核态、性能极高、配置较硬 | 超大流量四层转发 |
| HAProxy | 四/七层 | 专业 LB、健康检查强、配置灵活 | 需要精细七层路由/探活 |
| Nginx | 七层为主 | 易上手、反向代理+静态+缓存一体 | Web 反向代理、API 网关入门 |
2. 准备两个后端(模拟)
bash
# 在 8081 / 8082 起两个简单后端
python3 -m http.server 8081 --bind 127.0.0.1 &
python3 -m http.server 8082 --bind 127.0.0.1 &1
2
3
2
3
3. 写 Nginx 反向代理配置
nginx
# /etc/nginx/conf.d/lb.conf
upstream app {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
location / {
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
4. 检查并重载
bash
sudo nginx -t # 语法检查
sudo nginx -s reload # 热重载1
2
2
验证
bash
# 多次请求,应轮流落到两个后端
for i in 1 2 3 4; do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/; done
# 停掉一个后端再测,Nginx 默认会把请求发给存活的那个(无探活时可能短暂报错,见 15-upstream-health)1
2
3
2
3
常见坑
WARNING
Nginx upstream 默认轮询且不会主动剔除故障节点(仅靠连接失败时机重试)。要做到真正「坏节点自动摘掉」,需配 max_fails/fail_timeout 或 health_check(商业版/plus 或配合 15 篇探活)。
DANGER
LVS 需要内核模块与特定拓扑(DR/TUN/NAT 模式),配错易成「黑洞」丢流量。新手优先用 Nginx/HAProxy 七层方案,性能不够再上 LVS。