Debian 与 Nginx 的高可用架构设计
一、总体架构选型
- 方案一 主备 VIP(Keepalived + Nginx)
- 两台 Debian 节点运行 Nginx,通过 Keepalived 管理 VIP,实现故障自动切换;Nginx 层做反向代理与负载均衡到后端应用。适合中小规模、入口统一、对切换时延要求较高的场景。
- 方案二 四层/七层负载均衡(HAProxy/Nginx Ingress + Nginx 集群)
- 使用 HAProxy 或 Nginx 作为前端负载均衡器,后端多台 Nginx 以 active-active 方式承载流量;适合更大规模与更复杂路由、需要更强扩展性的场景。
二、方案一 主备 VIP 架构与实施要点
- 拓扑与组件
- 节点:nginx01、nginx02(Debian),各部署 Nginx 与 Keepalived;对外暴露 VIP:192.168.1.100(示例)。
- 安装与基础配置
- 在两台节点安装软件:
sudo apt update && sudo apt install -y nginx keepalived
- 统一 Nginx 配置(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/lb.conf),示例:
- upstream backend { server 10.0.1.11:80; server 10.0.1.12:80; }
- server { listen 80; location / { proxy_pass http://backend; 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_set_header X-Forwarded-Proto $scheme; } }
- Keepalived 关键配置
- 主节点 /etc/keepalived/keepalived.conf(示例):
- vrrp_script chk_nginx { script “killall -0 nginx”; interval 2; weight 2; }
- vrrp_instance VI_1 { state MASTER; interface eth0; virtual_router_id 51; priority 100; advert_int 1; authentication { auth_type PASS; auth_pass 1234; }; virtual_ipaddress { 192.168.1.100/24; }; track_script { chk_nginx; } }
- 备节点:state BACKUP,priority 90(或更低),其余一致;同一 virtual_router_id,同一网段 VIP。
- 启动与验证
- 启动:
sudo systemctl start nginx && sudo systemctl enable nginx && sudo systemctl start keepalived && sudo systemctl enable keepalived
- 验证:
ip addr show eth0 应看到主节点绑定 VIP;curl http://192.168.1.100 返回后端内容;停止主节点 Nginx 或 Keepalived,观察 VIP 漂移到备节点并继续提供服务。
三、方案二 四层/七层负载均衡 + Nginx 集群
- 拓扑与组件
- 前端:HAProxy/Nginx Ingress Controller(可部署 2 台并做自身高可用);后端:nginx01、nginx02、… 多台 Nginx 作为 Web/反向代理层,统一反向代理到应用集群。
- HAProxy 示例配置(/etc/haproxy/haproxy.cfg)
- global 与 defaults 常规参数;frontend http-in bind *:80;backend nginx-backend 配置 balance(如 roundrobin/source)、option httpchk GET /status、http-check expect status 200;server 行后加 check;Nginx 节点需提供 /status 健康检查端点(stub_status)。
- Nginx 健康检查与上游
- upstream 中使用 max_fails/fail_timeout 做被动健康检查;如需更强能力,可使用 Nginx Plus 或第三方模块实现主动健康检查。
- 扩展与优势
- 多节点 active-active 提升吞吐与容错;可叠加 DNS 轮询 做更外层的简单分发;适合需要更强扩展与灰度/蓝绿发布能力的生产环境。
四、健康检查与故障切换设计
- 进程级健康检查
- Keepalived 通过 vrrp_script 调用
killall -0 nginx 探测 Nginx 存活;失败则降低优先级或停止 Keepalived,触发 VIP 漂移,避免“脑裂”。
- 应用层健康检查
- Nginx upstream 使用
max_fails=3 fail_timeout=30s 等参数实现被动摘除;前端负载均衡器(如 HAProxy)通过 HTTP 健康检查(/status)主动探测后端 Nginx 可用性,异常节点自动下线。
- 状态页与观测
- 为 Nginx 配置
stub_status 或自建 /healthz,供负载均衡器与监控系统采集;结合 Prometheus + Grafana 做指标可视化与告警,配合 ELK 做日志集中分析。
五、部署与运维清单
- 网络与安全
- 确保 VIP 所在网段与节点网卡一致;在交换机/云安全组放行 VRRP(协议号 112)与健康检查端口;对外仅暴露 80/443,管理口限制来源。
- 配置与发布
- 使用 Ansible/Puppet 统一管理 Nginx 与 Keepalived 配置,变更通过 CI/CD 推送与灰度发布,变更前备份与回滚预案。
- 监控与演练
- 建立主机与应用指标、日志、拨测的立体监控;定期演练“停 Nginx/拔网线/宕机”等故障场景,验证 VIP 漂移与恢复时延;对数据库/会话等状态依赖进行一致性或外部化(如 Redis 集群)处理。