Nginx + Keepalived 高可用部署实战:从源码安装到主备切换
一、方案概述
本文记录一套基于 Nginx + Keepalived 的高可用部署方案。整体思路是:在两台服务器上分别源码安装 Nginx 与 Keepalived,由 Keepalived 通过 VRRP 协议维护一个虚拟 IP(VIP),并借助自定义检测脚本监控 Nginx 进程状态。当主节点 Nginx 异常时,VIP 自动漂移到备节点,从而保证服务持续可用。
部署前请确认以下前提条件:
- 两台服务器(主、备)操作系统一致,建议 CentOS 7 及以上版本。
- 两台服务器处于同一网段,且网络互通。
- 具备 root 权限,可执行安装与系统服务操作。
- 规划好虚拟 IP(VIP),例如
10.10.x.x,该 IP 不能与现有主机冲突。
二、部署 Nginx
2.1 下载安装包
通过 Nginx 官网下载源码安装包,地址:http://nginx.org/en/download.html。下载完成后上传至服务器,以下操作均在 root 权限下执行。
2.2 安装依赖包
Nginx 编译依赖 PCRE(正则支持)、OpenSSL(HTTPS 支持)和 zlib(gzip 压缩支持),先安装如下依赖:
yum install pcre*
yum install openssl*
yum install zlib
yum install zlib-devel
2.3 解压安装包
将安装包上传至服务器并解压,具体位置可根据项目实际情况指定,这里放在 /usr/local 目录下:
cp nginx-1.x.x.tar.gz /usr/local
cd /usr/local
tar -zxvf nginx-1.x.x.tar.gz
2.4 编译安装
解压完毕后进入解压目录,执行配置与编译安装:
cd nginx-1.x.x
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-pcre
make && make install
参数说明:
--prefix:指定安装目录。--with-http_ssl_module:启用 HTTPS 支持。--with-http_stub_status_module:启用状态监控模块。--with-pcre:启用 PCRE 正则支持。
2.5 启动与验证
进入安装目录,启动 Nginx:
cd /usr/local/nginx
./sbin/nginx
查看服务是否启动:
ps -ef|grep "nginx"
正常情况下可以看到两个进程:一个 master 进程和一个 worker 进程,说明 Nginx 已成功启动。
2.6 修改配置与重载
根据业务需要修改 conf/nginx.conf 完成配置,修改后重载 Nginx 服务使配置生效:
./sbin/nginx -s reload
三、部署 Keepalived
3.1 下载安装包
通过 Keepalived 官网下载安装包,官网地址:https://www.keepalived.org/download/。
3.2 解压与编译安装
mkdir -p /usr/local/keepalived
cp keepalived-2.4.3.tar.gz /usr/local/keepalived
tar -zxvf /usr/local/keepalived/keepalived-2.4.3.tar.gz
cd /usr/local/keepalived/keepalived-2.4.3
./configure --prefix=/opt/egoo/keepalived
make
make install
3.3 拷贝配置文件与启动脚本
将 Keepalived 的配置文件、启动脚本和可执行文件拷贝到系统标准路径,便于通过 systemctl 管理:
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
cp /usr/local/keepalived/keepalived-2.4.3/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
mkdir /etc/keepalived
cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
至此 Keepalived 安装完成,可通过如下命令操作服务:
systemctl start|stop|restart keepalived
四、配置高可用
在 /etc/keepalived 目录下需要准备两个文件:
keepalived.conf:Keepalived 配置文件。nginx_check.sh:Nginx 进程检测脚本。
4.1 主节点 keepalived.conf
! Configuration File for keepalived
global_defs {
路由id,主备节点不能相同
router_id node1
}
自定义监控脚本
vrrp_script chk_nginx {
脚本位置
script "/etc/keepalived/nginx_check.sh"
脚本执行的时间间隔
interval 1
fall 3
weight 0
}
vrrp_instance VI_1 {
# 优先级较高的keepalived,添加此配置解决异常恢复后再次抢占的问题
#nopreempt
# Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点
state MASTER
# 指定监测的网卡,可以使用 ifconfig 或 ip a 进行查看,网卡名根据实际情况修改
interface eth0
# 虚拟路由的id,主备节点需要设置为相同即可
virtual_router_id 35
# 优先级,主节点的优先级需要设置比备份节点高
priority 100
# 设置主备之间的检查时间,单位为秒
advert_int 1
# 定义验证类型和密码
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址,可以设置多个
virtual_ipaddress {
10.10.x.x/24
}
# 调用上面自定义的监控脚本
track_script {
chk_nginx
}
}
4.2 备节点 keepalived.conf
! Configuration File for keepalived
global_defs {
路由id,主备节点不能相同
router_id node2
}
自定义监控脚本
vrrp_script chk_nginx {
脚本位置
script "/etc/keepalived/nginx_check.sh"
脚本执行的时间间隔
interval 1
fall 3
weight 0
}
vrrp_instance VI_1 {
# 优先级较高的keepalived,添加此配置解决异常恢复后再次抢占的问题
#nopreempt
# Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点
state BACKUP
# 指定监测的网卡,可以使用 ifconfig 或 ip a 进行查看,网卡名根据实际情况修改
interface eth0
# 虚拟路由的id,主备节点需要设置为相同即可
virtual_router_id 35
# 优先级,主节点的优先级需要设置比备份节点高
priority 100
# 设置主备之间的检查时间,单位为秒
advert_int 1
# 定义验证类型和密码
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址,可以设置多个
virtual_ipaddress {
10.10.x.x/24
}
# 调用上面自定义的监控脚本
track_script {
chk_nginx
}
}
注意:主备节点的
router_id必须不同,virtual_router_id必须相同,authentication中的密码需保持一致。备节点的priority建议设置得比主节点低(例如 90),以便主节点优先持有 VIP。
4.3 Nginx 检测脚本
nginx_check.sh 检测脚本需要放在两台 Keepalived 机器上,配置如下:
#!/bin/bash
NGINX=nginx
LOGFILE=/etc/keepalived/nginx-error.log
check nginx in process
check nginx process than 2
check Nginx PID
CheckPID() {
pid=pidof ${NGINX}
if [ ! -n "${pid}" ];then
PrintLogger 0 "Nginx process not found, Nginx panic!"
exit 1
fi
}
CheckProcess() {
count=ps -C nginx --no-header |wc -l
if [ ${count} -lt 2 ];then
PrintLogger 0 "Nginx worker process is abnormal, Nginx is not available!"
exit 1
fi
}
CheckPID
CheckProcess
脚本添加可执行权限:
chmod +x /etc/keepalived/nginx_check.sh
五、注意事项
5.1 云环境下的 VRRP 组播问题
如果部署在云环境,Keepalived 出现频繁切换,通常是因为 VRRP 组播(224.0.0.18)不通,导致 VRRP 心跳协商不稳定、主备状态反复震荡。此时需要在 keepalived.conf 的 vrrp_instance 中增加单播配置:
unicast_src_ip 10.10.x.1 # 本节点IP地址
unicast_peer {
10.10.x.2 # 其他节点IP地址
}
主备节点分别填写自己的 IP 作为 unicast_src_ip,并将对端 IP 填入 unicast_peer。
5.2 其他实践建议
- 确保两台服务器的防火墙放通 VRRP 协议(协议号 112),否则心跳无法正常传递。
- 主备节点的 Nginx 配置应保持一致,避免切换后行为差异。
- 建议开启
nopreempt,避免主节点恢复后再次抢占 VIP 造成二次抖动。 - 部署完成后可通过
ip a查看 VIP 是否绑定在预期节点上,并通过停止主节点 Nginx 验证切换效果。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)