1. 为什么需要Nginx高可用集群?
现代Web服务对可用性的要求已经达到99.99%甚至更高。单节点Nginx服务存在单点故障风险,一旦服务器宕机或网络中断,整个服务就会不可用。去年某电商平台因负载均衡器故障导致2小时服务中断,直接损失超过300万元——这就是我们需要构建高可用集群的现实意义。
高可用集群通过多节点冗余部署,配合健康检查和故障自动转移,可以实现:
- 服务不间断:单个节点故障时自动切换到备用节点
- 负载均衡:将流量合理分配到多个服务器
- 平滑升级:逐个节点更新不影响整体服务
2. 集群架构设计要点
2.1 典型双节点主备架构
[客户端] | [VIP: 192.168.1.100] ├── [Nginx主节点: 192.168.1.101] └── [Nginx备节点: 192.168.1.102] | [后端应用服务器集群]关键组件:
- VIP(虚拟IP):客户端统一访问的入口IP
- Keepalived:实现VIP漂移和健康检查
- Nginx:实际处理请求的负载均衡器
2.2 多节点负载均衡架构
对于超高流量场景,可以采用多活架构:
[客户端] | [L4负载均衡器] ├── [Nginx节点1] ├── [Nginx节点2] └── [Nginx节点3] | [应用服务器集群]这种架构下,每个Nginx节点都是平等的,通过DNS轮询或硬件负载均衡器分发流量。
3. 详细搭建步骤
3.1 基础环境准备
在两台服务器上安装Nginx和Keepalived:
# Ubuntu/Debian sudo apt update sudo apt install -y nginx keepalived # CentOS/RHEL sudo yum install -y epel-release sudo yum install -y nginx keepalived注意:确保两台服务器的时间同步(使用ntp或chrony),时间不同步会导致集群异常。
3.2 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 } track_script { chk_nginx } } vrrp_script chk_nginx { script "/usr/bin/killall -0 nginx" interval 2 weight -20 }备节点配置只需修改:
state BACKUPpriority 90
3.3 Nginx负载均衡配置
统一的Nginx配置(/etc/nginx/nginx.conf):
upstream backend { server 10.0.0.1:8080; server 10.0.0.2:8080; keepalive 32; } server { listen 80; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; } }3.4 启动与验证
sudo systemctl enable --now nginx keepalived验证VIP漂移:
- 在主节点执行
ip a查看VIP绑定 - 停止主节点Nginx:
systemctl stop nginx - 10秒内VIP应自动迁移到备节点
4. 高级配置与优化
4.1 健康检查增强
默认的进程检查不够全面,建议使用主动健康检查:
upstream backend { server 10.0.0.1:8080 max_fails=3 fail_timeout=30s; server 10.0.0.2:8080 max_fails=3 fail_timeout=30s; check interval=3000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD /health HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }需要安装nginx_upstream_check_module模块。
4.2 会话保持配置
对于需要会话保持的应用:
upstream backend { ip_hash; server 10.0.0.1:8080; server 10.0.0.2:8080; }或者使用cookie:
upstream backend { server 10.0.0.1:8080; server 10.0.0.2:8080; sticky cookie srv_id expires=1h domain=.example.com path=/; }5. 常见问题排查
5.1 VIP不漂移
检查步骤:
- 确认keepalived进程运行:
ps aux | grep keepalived - 检查日志:
journalctl -u keepalived -f - 验证防火墙是否放行VRRP协议(IP协议号112)
5.2 脑裂问题
现象:两台服务器同时持有VIP 解决方法:
- 检查网络连通性,确保心跳线正常
- 调整
advert_int和priority参数 - 配置多播检测(如果网络支持)
5.3 性能调优
关键参数调整:
worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 4096; multi_accept on; use epoll; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 10000; }6. 生产环境建议
监控指标:
- Nginx:active connections, request rate, upstream响应时间
- 系统:CPU、内存、网络带宽
- Keepalived:VIP状态变化次数
安全加固:
server { listen 80 default_server; return 444; }禁止未绑定域名的访问
日志分析:
log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'upstream:$upstream_addr $upstream_response_time';灰度发布方案:
split_clients "${remote_addr}${http_user_agent}" $variant { 50% backend_v1; 50% backend_v2; }
在实际运维中,我们遇到过VIP漂移延迟的问题,最终发现是服务器ARP缓存设置不当导致。解决方法是在keepalived配置中添加:
vrrp_garp_master_refresh 60 vrrp_garp_master_repeat 2这个配置可以确保VIP切换后立即发送GARP包更新网络设备缓存。