借助keepalived配置高可用nginx集群

借助keepalived配置高可用nginx集群

Nginx 是一种高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3代理服务器。Nginx因其轻量级、资源占用少、并发性能强等特点,广泛应用于负载均衡、静态内容服务和反向代理等场景,尤其在高并发环境下表现出色。

Keepalived 是一个用来实现高可用性服务的工具,它通过VRRP(虚拟路由冗余协议)来管理虚拟IP地址,确保主机发生故障时,VIP自动漂移到备用节点,保证服务的连续性。Keepalived常与Nginx搭配使用,实现Nginx服务器的高可用集群配置。

1. 环境准备

确保你有两个或多个服务器,这些服务器将运行Nginx和Keepalived来组成高可用集群。本文使用两台虚拟机,分别命名为nginx1nginx2,安装Nginx和Keepalived搭建高可用的nginx集群。

hostname ip 操作系统 软件版本
nginx1 192.168.1.2 centos7.9 keepalived-1.3.5-19.el7.x86_64;nginx-1.20.1-10.el7.x86_64
nginx2 192.168.1.9 centos7.9 keepalived-1.3.5-19.el7.x86_64;nginx-1.20.1-10.el7.x86_64

2. 安装Nginx

在每台服务器上安装Nginx,可以使用以下命令:

bash 复制代码
sudo yum install nginx

安装完成后,确保Nginx服务正常启动:

bash 复制代码
sudo systemctl start nginx
sudo systemctl enable nginx

系统防火墙配置:

bash 复制代码
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

3. 安装Keepalived

Keepalived负责虚拟IP(VIP)的管理和故障转移。执行以下命令安装keepalived:

bash 复制代码
sudo yum install keepalived

4. Keepalived配置

nginx1nginx2上分别配置Keepalived。Keepalived的主要配置文件是 /etc/keepalived/keepalived.conf

主节点(nginx1)配置

编辑 /etc/keepalived/keepalived.conf,配置如下:

bash 复制代码
global_defs {
   router_id nginx1
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 指定检查脚本路径
    interval 2                               # 每2秒检查一次
    weight -10                               # 如果Nginx挂掉,优先级减10。确保降低优先级后低于slave节点优先级
    fall 10
    rise 2
}

vrrp_instance VI_1 {
    state MASTER                 # 主节点为 MASTER,备节点为 BACKUP
    interface eth0               # 绑定的网卡接口
    virtual_router_id 51         # VRID 相同,表示同一个虚拟路由器
    priority 100                 # 优先级,主节点要比备节点高
    advert_int 1                 # 检测时间间隔
    authentication {
        auth_type PASS           # 认证方式
        auth_pass 1111           # 认证密码
    }
	unicast_src_ip 192.168.1.2          #配置单播的源地址,即本机地址
    unicast_peer {            # 默认为组播模式,此处配置单播
        192.168.1.9             # 备节点的IP地址,如果由多个备节点,可以配置多个,每行一个
    }
    virtual_ipaddress {
        192.168.1.14            # 虚拟IP地址 (VIP)
    }
    track_script {
        chk_nginx    # 跟踪Nginx检查脚本
    }
}

说明

默认情况下,keepalived使用组播模式,keepalived将全部的心跳包信息都会向默认的224.0.0.18的组播地址发送,本文使用的虚拟机环境,使用的ovs不能支持组播,此处配置单播模式。

可以通过抓包tcpdump -i eth0 -nn -p vrrp来查看相关报文。

备节点(nginx2)配置

nginx2上进行类似的配置,将state改为BACKUP;并将priority设置为比主节点低的值,例如90;配置单播地址等:

bash 复制代码
global_defs {
   router_id nginx2
}

vrrp_instance VI_1 {
    state BACKUP    # 备节点为 BACKUP
    interface eth0
    virtual_router_id 51    # VRID 相同
    priority 99    # 优先级,备节点要比主节点低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111       # 认证密码相同
    }
	unicast_src_ip 192.168.1.9          #配置单播的源地址,即本机地址
    unicast_peer {            # 默认为组播模式,此处配置单播
        192.168.1.2             # 备节点的IP地址,如果由多个备节点,可以配置多个,每行一个
    }
    virtual_ipaddress {
        192.168.1.14    # 虚拟IP地址 (VIP)
    }
    track_script {
        chk_nginx    # 跟踪Nginx检查脚本
    }
}

配置nginx健康检查脚本

在每台服务器上创建一个检查脚本,例如/etc/keepalived/check_nginx.sh,内容如下:

bash 复制代码
#!/bin/bash
if ! pidof nginx > /dev/null; then
    exit 1  # Nginx 没有运行,返回非 0 值表示失败
fi
exit 0  # Nginx 运行正常

该脚本通过curl命令检查Nginx服务是否正常响应,如果Nginx响应异常,则返回状态码非0,这样Keepalived可以根据返回状态做出决定。

添加脚本的执行权限:

bash 复制代码
sudo chmod +x /etc/keepalived/check_nginx.sh

5. 启动Keepalived

配置完成后,启动Keepalived服务并使其开机自启:

bash 复制代码
sudo systemctl start keepalived
sudo systemctl enable keepalived

此时vip应该已经绑定到主节点,可以通过 ip addr show 命令查看。在主节点上通过tcpdump命令抓包,可以看到keepalived发送的vrrp报文。

bash 复制代码
# 单播模式下主节点只对备节点发送心跳包
]# tcpdump -i eth0 -p vrrp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:14:53.887545 IP 192.168.1.2 > 192.168.1.9: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
21:14:54.888588 IP 192.168.1.2 > 192.168.1.9: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
21:14:55.889684 IP 192.168.1.2 > 192.168.1.9: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
21:14:56.890752 IP 192.168.1.2 > 192.168.1.9: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

6. 验证keepalived的高可用

验证高可用性的方法有很多,这里我们通过停止主节点上的Keepalived服务或者关闭主节点来模拟节点故障,验证VIP的切换。

  • 使用命令 ip addr show 查看主节点是否持有虚拟IP(VIP),你应该在nginx1上看到VIP 192.168.1.14
  • 停止nginx1上的Keepalived服务:
bash 复制代码
sudo systemctl stop keepalived

短暂的等待后(几秒钟),VIP应该会自动切换到nginx2,在nginx2上使用 ip addr show 命令查看。

说明

上述keepalived配置的是抢占模式,等待master节点恢复正常后,vip会自动切换回主节点。

7. 配置Nginx

配置两台nginx服务器的index.html文件,内容不同,以便验证高可用性。

bash 复制代码
# nginx1
echo "Hello, this is nginx1!" > /usr/share/nginx/html/index.html
# nginx2
echo "Hello, this is nginx2!" > /usr/share/nginx/html/index.html

8. 测试nginx的高可用

通过curl命令访问VIP (192.168.1.14) 查看响应的节点。主节点nginx故障时,keepalived会自动将vip切换到备节点,确保继续提供nginx服务。

bash 复制代码
# 客户端访问vip,nginx1响应
]# curl 192.168.1.14
Hello, this is nginx1

# 在nginx1节点停止nginx服务,模拟异常场景
]# sudo systemctl stop nginx

# 客户端访问vip,nginx2响应
]# curl 192.168.1.14
Hello, this is nginx2
相关推荐
Benny的老巢6 小时前
Mac上用XAMPP搭建局域网可访问的开发环境,让局域网内其他设备通过域名访问
nginx·macos·apache·xampp·php开发环境
岚天start11 小时前
Docker部署NGINX实现服务四层转发方案
服务器·nginx·docker
微凉的衣柜13 小时前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
上去我就QWER14 小时前
什么是反向代理?
后端·nginx
小白冲鸭15 小时前
苍穹外卖-前端环境搭建-nginx双击后网页打不开
运维·前端·nginx
oMcLin16 小时前
如何在 Debian 11 上配置并优化 Nginx 与 Lua 脚本,提升高并发网站的动态请求处理能力?
nginx·debian·lua
笑笑�17 小时前
OpenResty + nginx_upstream_check_module 构建主动健康检查模块
运维·nginx·负载均衡·openresty
工具罗某人1 天前
docker快速部署minio
java·nginx·docker
oMcLin1 天前
如何在Ubuntu 24.04上通过配置Nginx与Keepalived实现高可用负载均衡集群
nginx·ubuntu·负载均衡
小Ti客栈2 天前
前后台Nginx部署同域名路径区分配置
java·前端·nginx