1. Nginx高可用集群架构概述
在当今互联网服务架构中,高可用性已成为系统设计的核心要求。Nginx作为高性能的反向代理服务器,其高可用集群方案能够有效解决单点故障问题,确保服务持续可用。这套方案通过主从Nginx节点配合Keepalived实现故障自动转移,当主节点不可用时,从节点能在秒级完成接管,对外提供不间断服务。
典型应用场景包括:
- 电商大促期间的流量负载均衡
- 金融支付系统的交易路由
- 在线教育平台的视频分发
- 企业级API网关服务
这套方案的技术栈组合为:
- Nginx 1.18+(负载均衡核心)
- Keepalived 2.0+(VIP管理)
- Tomcat 9.0+(应用服务器)
- Linux CentOS 7+(操作系统)
2. 环境准备与拓扑设计
2.1 基础环境配置
硬件建议配置:
- 主从节点服务器:2核CPU/4GB内存/50GB磁盘
- 应用服务器:根据业务需求独立配置
- 网络要求:所有节点需在同一局域网段,建议千兆内网
软件版本要求:
bash复制# 验证环境版本
nginx -v
keepalived -v
java -version
网络拓扑要点:
- 规划192.168.200.0/24网段
- 主Nginx:192.168.200.128
- 从Nginx:192.168.200.129
- 虚拟IP(VIP):192.168.200.18
- Windows测试机需与虚拟机同网段
2.2 架构设计解析
主从架构的核心组件:
- 负载均衡层:双Nginx节点
- 应用服务层:Tomcat集群
- 高可用控制:Keepalived
- 健康检测:自定义Shell脚本
流量路径说明:
code复制客户端 -> VIP -> 主Nginx -> Tomcat集群
↘ 从Nginx(备用)
故障转移流程:
- Keepalived持续检测主节点状态
- 发现主节点不可达时
- 从节点接管VIP
- ARP广播更新MAC地址映射
- 流量自动切换到从节点
3. Nginx主从节点部署
3.1 主节点配置
安装Nginx后的关键配置:
nginx复制# /usr/local/nginx/conf/nginx.conf
http {
upstream tomcat_cluster {
server 192.168.200.128:8080 weight=5;
server 192.168.200.1:8080 weight=3;
}
server {
listen 7777;
server_name look.sunxiansheng.cn;
location /search/ {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
}
}
}
启动命令注意事项:
bash复制# 测试配置文件语法
./sbin/nginx -t
# 指定配置文件启动
./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 平滑重启命令
./sbin/nginx -s reload
3.2 从节点配置
克隆主节点后的调整要点:
- 修改server_name为look2.sunxiansheng.cn
- 检查upstream配置是否一致
- 确认防火墙放行7777端口
- 测试各Tomcat节点连通性
网络验证步骤:
bash复制# 检查IP配置
ifconfig | grep inet
# 测试节点间通信
ping 192.168.200.128
ping 192.168.200.1
# 验证端口连通性
telnet 192.168.200.128 8080
3.3 Tomcat集群部署
部署建议:
- Linux节点Tomcat置于/opt/tomcat
- Windows节点Tomcat避免使用带空格路径
- 统一设置JAVA_HOME环境变量
- 修改server.xml调整端口避免冲突
测试页面部署:
jsp复制<!-- cal.jsp示例 -->
<%@ page contentType="text/html;charset=UTF-8" %>
<%
int a = Integer.parseInt(request.getParameter("a"));
int b = Integer.parseInt(request.getParameter("b"));
out.println(a + "+" + b + "=" + (a+b));
%>
4. Keepalived高可用配置
4.1 Keepalived编译安装
源码安装关键步骤:
bash复制# 解决依赖问题
yum install -y gcc openssl-devel popt-devel
# 编译安装
tar -zxvf keepalived-2.0.20.tar.gz
cd keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install
# 验证安装
which keepalived
/usr/local/sbin/keepalived -v
4.2 主节点配置详解
/etc/keepalived/keepalived.conf:
conf复制global_defs {
router_id nginx_master # 唯一标识
}
vrrp_script chk_nginx {
script "/etc/keepalived/ch_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.18/24
}
track_script {
chk_nginx
}
}
4.3 从节点配置差异
关键修改点:
- state改为BACKUP
- priority设为90(低于主节点)
- 保持其他参数完全一致
- 相同virtual_router_id
4.4 健康检测脚本
/etc/keepalived/ch_nginx.sh:
bash复制#!/bin/bash
counter=$(ps -C nginx --no-header | wc -l)
if [ "${counter}" = "0" ]; then
/usr/local/nginx/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-header | wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
脚本优化建议:
- 增加启动重试机制
- 添加日志记录功能
- 设置超时控制
- 完善错误处理
5. 集群测试与验证
5.1 基础功能测试
测试步骤:
- 分别访问主从Nginx的域名
- 观察响应内容差异
- 测试VIP访问
- 检查负载均衡效果
预期结果:
code复制主节点:http://look.sunxiansheng.cn:7777/search/cal.jsp?a=1&b=2
从节点:http://look2.sunxiansheng.cn:7777/search/cal.jsp?a=1&b=2
VIP访问:http://192.168.200.18:7777/search/cal.jsp?a=1&b=2
5.2 故障转移测试
模拟故障场景:
bash复制# 主节点执行
killall keepalived
# 或
systemctl stop nginx
验证要点:
- VIP是否漂移到从节点
- 切换时间是否在3秒内
- 会话是否保持(如有状态服务)
- 监控告警是否触发
5.3 恢复测试
主节点恢复步骤:
- 修复故障原因
- 依次启动服务:
bash复制systemctl start nginx
systemctl start keepalived
- 观察VIP是否自动切回
- 验证服务完全恢复
6. 生产环境优化建议
6.1 性能调优参数
Nginx优化:
nginx复制worker_processes auto;
worker_connections 10240;
keepalive_timeout 65;
gzip on;
Keepalived优化:
conf复制vrrp_instance VI_1 {
preempt_delay 300 # 抢占延迟防止抖动
notify_master "/path/to/notify.sh master"
notify_backup "/path/to/notify.sh backup"
}
6.2 监控方案设计
建议监控指标:
- Nginx:活跃连接数、QPS、响应时间
- Keepalived:VIP状态、切换次数
- 系统:CPU、内存、网络流量
Prometheus监控示例:
yaml复制- job_name: 'nginx'
static_configs:
- targets: ['192.168.200.128:9113','192.168.200.129:9113']
- job_name: 'keepalived'
static_configs:
- targets: ['192.168.200.128','192.168.200.129']
6.3 常见问题排查
典型问题及解决方案:
| 问题现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
| VIP无法ping通 | vrrp_strict未注释 | ip addr show | 注释配置并重启 |
| 主从不切换 | 防火墙阻止VRRP | tcpdump -i ens33 vrrp | 放行协议112 |
| 脚本不生效 | 权限不足 | ls -l /etc/keepalived | chmod +x脚本 |
| 脑裂问题 | 网络分区 | ping测试各节点 | 检查交换机配置 |
日志分析要点:
bash复制# Nginx错误日志
tail -f /var/log/nginx/error.log
# Keepalived日志
journalctl -u keepalived -f
# 系统日志
tail -f /var/log/messages
7. 架构扩展思路
7.1 多节点集群
扩展方案:
- 增加Nginx节点形成多活集群
- 使用DNS轮询配合健康检查
- 引入LVS做第一层负载
- 考虑BGP协议实现跨机房高可用
7.2 容器化部署
Docker Compose示例:
yaml复制version: '3'
services:
nginx-master:
image: nginx:1.21
ports:
- "7777:7777"
volumes:
- ./nginx-master.conf:/etc/nginx/nginx.conf
networks:
vrrp_net:
ipv4_address: 192.168.200.128
keepalived:
image: osixia/keepalived:2.0.20
cap_add:
- NET_ADMIN
volumes:
- ./keepalived-master.conf:/container/service/keepalived/assets/keepalived.conf
environment:
KEEPALIVED_INTERFACE: eth0
KEEPALIVED_VIRTUAL_IPS: "192.168.200.18/24"
networks:
vrrp_net:
ipv4_address: 192.168.200.130
7.3 云原生方案
AWS架构示例:
- 使用ELB作为入口
- Nginx部署在EC2 Auto Scaling组
- Route53实现DNS故障转移
- CloudWatch监控集群状态
Kubernetes实现:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ha
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer