1. 为什么需要Nginx高可用集群?
在线上业务场景中,单点故障是致命的。去年我们某个核心服务因为单台Nginx服务器硬盘故障,导致整个电商平台不可用近2小时,直接损失超过百万。这个惨痛教训让我意识到:Nginx作为流量入口,必须实现高可用。
典型的高可用架构需要满足几个核心指标:
- 99.99%以上的服务可用性(年停机时间不超过52分钟)
- 故障自动转移时间控制在30秒内
- 支持无缝的水平扩展
2. 集群架构设计
2.1 主流方案对比
我对比过三种常见方案:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DNS轮询 | 实现简单 | 故障检测延迟高 | 非关键业务 |
| LVS+Keepalived | 性能损耗小 | 配置复杂 | 高性能要求场景 |
| Nginx+Keepalived | 功能丰富,配置灵活 | 有一定性能损耗 | 大多数Web业务 |
最终选择Nginx+Keepalived方案,因为:
- 可以利用Nginx丰富的七层功能(如URL路由、限流等)
- 社区资料丰富,遇到问题容易排查
- 与我们现有技术栈契合度高
2.2 具体架构实现
我们的生产环境采用双主模式(DR模式):
[VIP: 192.168.1.100] | ----------------------------------------- | | [Nginx Master] [Nginx Backup] 192.168.1.101 192.168.1.102关键组件:
- Keepalived:通过VRRP协议实现VIP漂移
- Nginx:处理实际请求
- 脚本监控:自定义健康检查
3. 详细配置指南
3.1 Keepalived配置
主节点配置(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 # 备份节点设为90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100/24 dev eth0 } }关键参数说明:
virtual_router_id:必须集群内一致priority:决定主备关系advert_int:心跳间隔,生产环境建议1秒
3.2 Nginx配置优化
在nginx.conf中需要增加:
upstream backend { server 10.0.0.1:8080 weight=5; server 10.0.0.2:8080 weight=5; keepalive 32; # 保持长连接 } server { listen 80; location / { proxy_pass http://backend; proxy_next_upstream error timeout http_500; } }4. 运维监控要点
4.1 健康检查策略
我们开发了增强检查脚本:
#!/bin/bash # 检查Nginx进程 if ! pgrep -x "nginx" >/dev/null; then systemctl restart nginx || exit 1 fi # 检查端口响应 if ! nc -z localhost 80; then exit 1 fi # 检查业务接口 if ! curl -s --connect-timeout 3 http://localhost/health | grep -q "OK"; then exit 1 fi4.2 关键监控指标
建议监控以下数据:
- VIP漂移次数(突然增加可能网络有问题)
- Nginx的active connections
- 5xx错误率
- 后端响应时间(P99)
5. 常见故障处理
5.1 脑裂问题
现象:两台服务器都认为自己是Master 解决方法:
- 检查网络连通性
- 配置防火墙允许VRRP协议(IP协议号112)
- 设置nopreempt防止抢占
5.2 VIP不漂移
排查步骤:
ip addr show eth0查看VIP绑定情况journalctl -u keepalived查看日志- 手动执行健康检查脚本测试
6. 性能调优建议
根据我们的压测数据,优化后性能提升37%:
| 优化项 | QPS提升 | 内存消耗降低 |
|---|---|---|
| 开启reuseport | 15% | - |
| 调整worker_connections | 12% | 8% |
| 启用gzip_static | 10% | 5% |
具体配置:
events { worker_connections 65535; use epoll; multi_accept on; } http { gzip_static on; open_file_cache max=10000 inactive=30s; }这套架构已经在我们生产环境稳定运行3年,经历过双11大促考验。最大的经验是:高可用不是配置出来,而是测出来的。建议每月做一次故障演练,真正检验系统的可靠性