ARTICLE

DMIT 负载均衡实战:Nginx upstream 多节点分发

用 Nginx 搭建七层负载均衡:调度策略、健康检查、会话保持与 TLS 卸载。

什么时候需要负载均衡

单台 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 指令以官方文档为准。

NEXT STEP

看完教程,选一台合适的 DMIT

用套餐快照按预算与线路筛选,或直接前往官网查看实时库存。

推广披露:通过链接购买可能为推荐者带来佣金,不会增加你的购买价格。