Nginx + Keepalived 高可用负载均衡集群实现
Nginx 作为高性能的反向代理服务器,结合 Keepalived 实现 VIP(虚拟 IP)漂移,可以构建高可用的负载均衡集群。以下是具体实现方法:
环境准备
- 两台以上服务器安装 Nginx 和 Keepalived
- 统一的虚拟 IP(VIP),例如 10.96.4.32
- 所有节点配置相同的 Nginx 负载均衡规则
Nginx 负载均衡配置
在每台 Nginx 服务器上配置相同的 upstream 规则,指向后端应用服务器:
http {
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
Keepalived 主节点配置
主节点(Master)配置文件 /etc/keepalived/keepalived.conf
:
注:# 主备节点设为BACKUP+nopreempt才可以实现非抢占式
! Configuration File for keepalived
global_defs {
router_id lb02 #标识信息
}
vrrp_script check {
script "/usr/local/nginx/check/check_nginx.sh"
interval 4
}
vrrp_instance VI_1 {
state BACKUP #角色是master/backup # 所有节点设为BACKUP+nopreempt才可以实现非抢占式
interface eth0 #vip 绑定端口
virtual_router_id 40 #让master 和backup在同一个虚拟路由里,id 号必须相同;
priority 150 #优先级,谁的优先级高谁就是master ;
advert_int 3 #心跳间隔时间
nopreempt #非抢占式
authentication {
auth_type PASS #认证
auth_pass 1111 #密码
}
virtual_ipaddress {
10.96.4.32 #虚拟ip
}
track_script {
check
}
}
Keepalived 备节点配置
备节点(Backup)配置文件差异部分:
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
priority 100
# 其他配置与主节点相同
}
脚本本地检测,防止脑裂
#!/bin/bash
NGPID=$(ps -C nginx --no-header|wc -l)
NGINX=/usr/local/nginx/sbin/nginx
HTTPCODE=$(curl -s -o /dev/null -w "%{http_code}" "http://192.168.1.101:8080/RATIOHandleProject/ProxyService/ReportListProxyService?wsdl")
if [ $NGPID -lt 4 ];then
# $NGINX
# sleep 2
NGPIDT=$(ps -C nginx --no-header|wc -l)
if [ $NGPIDT -lt 4 ] && [ "$HTTPCODE" -ne 200 ];then
service keepalived stop
$NGINX -s stop
fi
fi
健康检查机制
Keepalived 通过以下方式确保高可用:
- 每 4 秒执行
check_nginx.sh
检查 Nginx 进程状态以及后端程序可用性检测 - 当 Nginx 和后端程序异常时,触发 VIP 漂移到备用节点
- 主节点恢复后,VIP 不自动回切(因设置
nopreempt
禁用抢占模式) - 心跳VIP之间每3秒进行VRRP协议通信检测
注意事项
- 确保防火墙允许 VRRP 协议通信(IP 协议号 112)
- 所有节点时间同步(NTP 服务)
- 建议配置邮件报警通知运维人员
- 生产环境建议使用至少 3 个节点避免脑裂问题
- 监控Nginx和Keepalived的运行状态(zabbix/prometheus)
通过这种架构,可以实现前端负载均衡服务的毫秒级故障转移,确保业务连续性。