生产环境 Nginx 双机热备部署 - Keepalived 多模式配置
生产环境下 Nginx 结合 Keepalived 实现高可用部署。内容包括 Nginx 编译安装与安全配置、Keepalived 主备模式(抢占与非抢占)及主主模式配置详解。通过脚本监控 Nginx 进程状态,实现 VIP 自动漂移与故障切换,保障服务稳定性。

生产环境下 Nginx 结合 Keepalived 实现高可用部署。内容包括 Nginx 编译安装与安全配置、Keepalived 主备模式(抢占与非抢占)及主主模式配置详解。通过脚本监控 Nginx 进程状态,实现 VIP 自动漂移与故障切换,保障服务稳定性。

yum install gcc gcc-c++
yum install zlib zlib-devel
yum install pcre pcre-devel
yum install openssl libssl-dev
解压命令:sudo tar -zxvf nginx-1.24.0.tar.gz
进入 nginx 路径:cd nginx-1.24.0
编译安装:
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-http_ssl_module
--with-http_ssl_module参数用于启用 SSL 支持。
sudo make install
sudo nginx
sudo nginx -s stop
sudo vim /etc/rc.d/rc.local
添加执行语句 /usr/bin/nginx
退出保存
开机启动文件授权
sudo chmod +x /etc/rc.d/rc.local
nginx -s reload
**Nginx 安全加固配置:**在 nginx.conf 配置文件里加上 TLSv1.2 TLSv1.3; 和隐藏版本号的部分。
# 在 server { } 块里配置启用 TLSv1.2 和 TLSv1.3 的参数
ssl_protocols TLSv1.2 TLSv1.3;
# 在 http { } 块里配置隐藏 Nginx 服务器版本信息的参数
server_tokens off;
yum -y install libnl libnl-devel
yum -y install gcc gcc-c++
yum -y install openssl
yum -y install openssl-devel
yum -y install libnl3-devel
tar -zxf keepalived-2.2.4.tar.gz
cd keepalived-2.2.4
./configure --prefix=/usr/local/keepalived
make && make install
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
chkconfig keepalived on
systemctl start keepalived
ps -ef | grep keepalived
若发现未能正常启动,查看日志:
systemctl status keepalived.service -l
journalctl -u keepalived.service -f
tail -22f /var/log/messages | grep Keepalived
原因: 通过查询系统日志发现 keepalived 配置文件默认网卡名和当前服务器网卡名不一致。
解决: 修改 /etc/keepalived/keepalived.conf 的网卡名,与服务器同步即可。重启命令:systemctl start keepalived
存放目录:/mpjava/nginxcheck.sh
vim /mpjava/nginxcheck.sh
添加以下内容:
#!/bin/sh
nginxPidNum=`ps -C nginx --no-header |wc -l`
if [[ $nginxPidNum -eq 0 ]];
then
killall keepalived
fi
注:需要设置 nginxcheck.sh 有执行权限,chmod 777 /mpjava/nginxcheck.sh
主节点:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 10.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/mpjava/nginxcheck.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 主节点如果写 BACKUP,和配置下面的 nopreempt 参数就为 非抢占模式;如果写 MASTER,删除 nopreempt 参数,则为 抢占模式
nopreempt # 非抢占模式参数
interface enp4s3
virtual_router_id 69 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 100 # 主节点的优先级必须高于 从节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.10 # vip
}
}
从节点:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 10.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/mpjava/nginxcheck.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 从节点设置为 backup
nopreempt # 非抢占模式参数,如果不开启该模式,需要删除
interface eth0
virtual_router_id 69 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.10 # VIP
}
}
抢占模式: 启动两个节点的 nginx 和 keepalived,当主节点的 keepalived 关了后,VIP 会漂移到从节点上,当主节点启动后,此时 VIP 会漂移回主节点。
非抢占模式: 启动两个节点的 nginx 和 keepalived,当主节点的 keepalived 关了后,VIP 会漂移到从节点上,此时再将主节点启动后,VIP 不会漂移回主节点。
(以上验证方法用命令 ip a 实时查看网卡的 VIP 地址的漂移节奏)
高可用集群中的不抢占功能说明: 在一个 HA 集群中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。对于实时性和稳定性要求不高的业务系统来说,这种来回切换的操作还是可以接受的。而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性。
主节点 1:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 10.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/mpjava/nginxcheck.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER # 主节点为 MASTER
interface enp4s3
virtual_router_id 69 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 100 # MASTER 节点必须高于 BACKUP 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.8 # vip1
}
}
vrrp_instance VI_2 {
state BACKUP # 该节点设置为 backup
interface eth0
virtual_router_id 70 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 90 # MASTER 节点必须高于 BACKUP 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.9 # vip2
}
}
主节点 2:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 10.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/mpjava/nginxcheck.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 从节点设置为 backup
nopreempt # 非抢占模式参数,如果不开启该模式,需要删除
interface eth0
virtual_router_id 69 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 99 # MASTER 节点必须高于 BACKUP 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.8 # vip1
}
}
vrrp_instance VI_2 {
state MASTER # 该节点设置为 MASTER
interface eth0
virtual_router_id 70 # 同一个 VRRP 实例中每个节点的虚拟路由 ID 必须相同
priority 100 # MASTER 节点的优先级必须高于 BACKUP 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.9 # vip2
}
}
启动两个主节点的 nginx 和 keepalived,将 nginx 中配置的域名解析到这两个 VIP 地址上,浏览器访问正常。此时关闭其中一个主节点的 keepalived,VIP 会漂移到另外一台主节点服务器上。
(以上验证方法用命令 ip a 实时查看网卡的 VIP 地址的漂移节奏)
模式选择建议: 在 keepalived 的主备模式中,当主节点正常的时候,备节点永远处于闲置状态,不会接受 web 请求,这样就会浪费一半的资源。根据自身业务和资源等综合来选择模式。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online