主题
第 6 章 · 软件负载均衡实战
生活类比:选大堂经理也有不同风格——
Nginx 像干练的多面手,Web 场景够用又轻;
HAProxy 像专业调度员,统计报表极详细;
APISIX 像带 AI 助手的新经理,插件丰富还能热更新。
6.1 主流软件 LB 对比
| 产品 | 类型 | 强项 | 弱项 | 典型场景 |
|---|---|---|---|---|
| Nginx | L7 反向代理 + LB | 简单、高性能、生态大 | 开源版无主动健康检查 | 静态资源 + API 反代 |
| OpenResty | Nginx + Lua | 可编程、灵活 | 要会 Lua | 复杂网关逻辑 |
| HAProxy | L4/L7 专业 LB | 算法全、监控强、稳定 | 配置语法学习曲线 | 入口 LB、数据库入口 |
| Traefik | 云原生网关 | 自动发现 K8s/Docker | 极致性能不如 Nginx | 容器环境 |
| APISIX | API 网关 | 动态配置、插件、主动健康检查 | 组件较多 | 微服务 API 网关 |
| Envoy | 数据面代理 | xDS、可观测、Service Mesh | 配置复杂 | Istio 数据面 |
| LVS | Linux 内核 L4 | 极高性能 | 只做 L4 | 超大流量入口 |
6.2 Nginx 负载均衡(最常用)
详细配置见 front/nginx/06_load_balance,本章提炼核心。
最小可用配置
nginx
upstream api_backend {
least_conn;
server 10.0.0.1:8080 weight=2 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 weight=2 max_fails=3 fail_timeout=30s;
server 10.0.0.3:8080 weight=1 backup;
keepalive 64;
}
server {
listen 80;
location /api/ {
proxy_pass http://api_backend/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 2;
}
}三个必记配置组合
| 目的 | 配置 |
|---|---|
| 上游长连接 | keepalive + proxy_http_version 1.1 + Connection "" |
| 故障转移 | max_fails + fail_timeout + proxy_next_upstream |
| 真实客户端 IP | X-Real-IP + X-Forwarded-For |
生活例子
Nginx 像 连锁快餐店的标准 Operating Manual——照着做就能开起来,80% 场景够用。
6.3 HAProxy 简介
HAProxy 配置分 frontend(入口)和 backend(后端池):
haproxy
frontend http_front
bind *:80
default_backend api_servers
backend api_servers
balance leastconn
option httpchk GET /healthz
server s1 10.0.0.1:8080 check inter 5s fall 3 rise 2
server s2 10.0.0.2:8080 check inter 5s fall 3 rise 2| 指令 | 含义 |
|---|---|
balance leastconn | 最少连接算法 |
option httpchk | 主动 HTTP 健康检查 |
check inter 5s fall 3 rise 2 | 每 5s 探一次,3 败 down,2 胜 up |
何时选 HAProxy 而非 Nginx?
- 需要 更专业的 LB 统计(队列、会话、健康状态一页看清)
- 入口层 L4 + L7 统一 管理
- 对 主动健康检查 有强需求且不想上商业 Nginx Plus
6.4 APISIX / Kong(API 网关型)
适合 微服务 API 统一入口:
- 路由:
/user/*→ 用户服务 - 插件:限流、JWT 鉴权、Prometheus、链路追踪
- 动态 upstream:改配置不用 reload
json
{
"uri": "/api/*",
"upstream": {
"type": "roundrobin",
"nodes": {
"10.0.0.1:8080": 1,
"10.0.0.2:8080": 1
},
"checks": {
"active": {
"http_path": "/healthz",
"healthy": { "interval": 5, "successes": 2 },
"unhealthy": { "interval": 5, "http_failures": 3 }
}
}
}
}生活例子:APISIX 像 商场总服务台——不只指路,还能查会员、限人流、发优惠券(插件)。
6.5 LVS(四层极致性能)
LVS 工作在内核,转发模式:
| 模式 | 简述 |
|---|---|
| NAT | LB 改目标 IP,后端回程经 LB |
| DR(直接路由) | LB 只改 MAC,响应直达客户端,性能最高 |
| TUN | 跨机房隧道 |
[LVS VIP]
/ | \
[RS1] [RS2] [RS3] Real Server 集群适合 百万级并发连接 的入口,上面再挂 Nginx 做 L7。
6.6 选型决策(软件层)
小项目 / 静态 + API?
└─► Nginx upstream
要专业 LB 统计 + 主动健康检查?
└─► HAProxy 或 APISIX
K8s 容器环境?
└─► Traefik / Ingress-Nginx / APISIX Ingress
Service Mesh?
└─► Envoy(Istio 数据面)
百万连接 L4 入口?
└─► LVS + 上层 L76.7 性能优化要点
① 开启长连接(见 Nginx 06 章)
避免每次请求 TCP 三次握手。
② 合理 worker 与连接数
nginx
worker_processes auto;
events { worker_connections 65535; }③ 内核参数
bash
# 临时示例,生产按容量规划
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_tw_reuse=1④ 日志采样
高 QPS 时 access log 打满磁盘——可采样或走异步日志。
6.8 一句话总结
入门 Nginx,专业 HAProxy,微服务 APISIX/Envoy,极致 L4 用 LVS——先选对角色,再抠配置细节。
下一章 → 07 · 云原生与 K8s