一、方案概述

本文记录一套基于 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 目录下需要准备两个文件:

  1. keepalived.conf:Keepalived 配置文件。
  2. 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 验证切换效果。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐