什么时候需要负载均衡
单台 DMIT 实例扛不住流量、或业务不允许单点故障时,就需要把请求分发到多台服务器。负载均衡(Load Balancing)按层级分为:四层(TCP/UDP,转发快)与七层(HTTP/HTTPS,可按路径、Cookie 分发并卸载 TLS)。本文给出在 DMIT 上用 Nginx 搭建七层负载均衡的完整方案。
架构总览
访客 → LB(Nginx,DMIT 实例 A)
├→ app1(DMIT 实例 B)
├→ app2(DMIT 实例 C)
└→ app3(DMIT 实例 D)
LB 与后端之间走内网或公网均可;跨机房部署时可结合《机房选择》把后端放在不同区域做容灾。
Nginx upstream 配置
# /etc/nginx/conf.d/lb.conf
upstream myapp {
least_conn; # 最少连接调度
server 10.0.0.11:8000 weight=2 max_fails=3 fail_timeout=30s;
server 10.0.0.12:8000 max_fails=3 fail_timeout=30s;
server 10.0.0.13:8000 backup; # 备用节点
keepalive 32;
}
server {
listen 443 ssl;
server_name example.com;
# ssl_certificate ...;
location / {
proxy_pass http://myapp;
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; # 故障自动转移
}
}
调度策略怎么选
| 策略 | 行为 | 适用 |
|---|---|---|
| round-robin | 轮流分发(默认) | 后端性能相近 |
| least_conn | 优先发给当前连接最少的节点 | 请求耗时差异大 |
| ip_hash | 同一 IP 固定到同一节点 | 无共享会话的简单会话保持 |
| weight | 按权重分配 | 后端配置不均 |
健康检查
开源版 Nginx 使用被动检查:max_fails + fail_timeout 在连续失败后暂时摘除节点。更主动的方式是加一个轻量健康端点并用定时脚本探测:
# 后端应用提供 /healthz 返回 200
# LB 侧用 cron 每 30s 探测并告警
*/1 * * * * curl -sf http://10.0.0.11:8000/healthz || echo "app1 down" | mail -s "LB alert" ops@example.com
监控告警的完整方案见《Prometheus + Grafana 监控》。
会话保持与共享状态
- 优先把状态外置:Session 存 Redis、文件存对象存储,让任意节点都能服务任意请求
- 无法外置时用
ip_hash或应用层粘性 Cookie 过渡 - 数据库仍建议单写多读,读写分离见《数据库优化》
TLS 卸载与全链路 HTTPS
- 证书只装在 LB,后端走 HTTP 内网——配置简单、续期集中(见《HTTPS 配置》)
- 跨公网的后端链路必须加密:后端也装证书,LB 用
proxy_pass https://并校验 - 传递
X-Forwarded-Proto让应用知道原始协议,避免重定向死循环
常见问题
502 大量出现?
逐台检查后端健康状态与 LB 错误日志(tail -f /var/log/nginx/error.log);常见原因是后端进程挂掉或 keepalive 未按 HTTP/1.1 配置。排查思路见《故障排查指南》。
用户登录态丢失?
多节点间 Session 不共享导致。改用 Redis 集中存储 Session,或临时切 ip_hash。
真实 IP 拿不到?
确认 LB 已设置 X-Real-IP/X-Forwarded-For,且后端应用信任这些头;若前面还有 CDN,需结合《CDN 配置》恢复真实 IP。
相关文章
《Prometheus + Grafana 监控》、《性能调优指南》、《自动化部署》。
本文核对日期:2026-08-18。Nginx 指令以官方文档为准。