Nginx + Keepalived 高可用服务配置
IP | 角色 |
---|---|
192.168.10.31 | Nginx Node01 |
192.168.10.32 | Nginx Node02 |
192.168.10.200 | VIP |
在 Keepalived 的配置中,VIP(Virtual IP)概念是一个虚拟的IP地址,可以在备用节点接管主节点服务时使用,避免客户端连接断开。
配置 keepalived
安装 keepalived
两台 Nginx 服务器都需要安装 keepalived 服务
yum install -y keepalived
修改 keepalived 配置文件
Nginx Node01 节点
修改 /etc/keepalived/keepalived.conf
文件内容如下
global_defs {
router_id hap-nginx-ha-01
}
vrrp_script check_nginx_health {
script "/usr/local/nginx/script/check_nginx_health.sh"
interval 10
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 修改为部署主机的网卡名称
virtual_router_id 185 # 同一子网上的所有 VRRP 路由器中唯一,范围0-255
priority 100 # 优先级,每个节点不同
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass HAP-Nginx-Keepalived-Auth
}
track_script {
check_nginx_health
}
virtual_ipaddress {
192.168.10.200 # VIP address
}
}
- 注意两个节点配置文件中 priority 的值是不同的
- 默认仅需修改 interface 与 VIP address 即可
Nginx Node02 节点
修改 /etc/keepalived/keepalived.conf
文件内容如下
global_defs {
router_id hap-nginx-ha-01
}
vrrp_script check_nginx_health {
script "/usr/local/nginx/script/check_nginx_health.sh"
interval 10
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 修改为部署主机的网卡名称
virtual_router_id 185 # 同一子网上的所有 VRRP 路由器中唯一,范围0-255
priority 90 # 优先级,每个节点不同
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass HAP-Nginx-Keepalived-Auth
}
track_script {
check_nginx_health
}
virtual_ipaddress {
192.168.10.200 # VIP address
}
}
- 注意两个节点配置文件中 priority 的值是不同的
- 默认仅需修改 interface 与 VIP address 即可
创建 Nginx 相关脚本
两个节点都需要创建以下 Nginx 相关脚本
创建脚本存放目录
mkdir -p /usr/local/nginx/script/
执行 vim /usr/local/nginx/script/check_nginx_health.sh
创建 Nginx 状态检查脚本
check_nginx_health.sh
脚本内容如下:
#!/bin/bash
# 日志函数
nginx_keepalived_log_file="/var/log/nginx_keepalived.log"
log_info() {
echo "$(date +"%Y-%m-%d %H:%M:%S") INFO: $1" >> "$nginx_keepalived_log_file"
}
check_nginx_status() {
ps aux | grep nginx | grep -v grep | grep -v check_nginx_health
nginx_process=$?
}
# 定义检测次数
max_retries=3
retry_interval=2
# 连续检查 Nginx 服务状态,最多尝试 max_retries 次
retry_count=0
while true; do
check_nginx_status
if [ $nginx_process -eq 0 ]; then
# Nginx 进程正常,退出循环
exit 0
else
if [ $retry_count -ge $max_retries ]; then
# 达到最大重试次数,执行停止 Keepalived 服务的操作并退出
systemctl stop keepalived
log_info "After $max_retries retries, Nginx process remains unhealthy, stop Keepalived"
exit 0
fi
fi
retry_count=$((retry_count + 1))
sleep $retry_interval
done
给所有脚本添加可执行权限
chmod +x /usr/local/nginx/script/*.sh
启动 Keepalived
systemctl start keepalived
systemctl enable keepalived
故障排除
两台服务器都有 VIP
通常可能受以下原因导致:
-
两台机器之间有防火墙或其他网络限制
-
限制了端口(默认使用 112 端口)
-
网络环境不支持 VRRP(虚拟路由冗余协议)
-
-
两台机器之间互相到对方地址网络不通
-
两台节点配置的优先级可能一致,导致无法选举主节点
-
可以通过 /var/log/messages 日志文件进行排查
两台服务器都没有 VIP
通常可能受以下原因导致:
-
keepalived.conf 中指定的 vrrp_script 脚本文件执行异常,返回总是非0错误值导致keepalived 状态一直无法完成初始化,无法绑定vip
-
可以通过 /var/log/messages 日志文件进行排查