在实际的场景中,我们使用nginx实现后端服务器的反向代理和负载均衡,但是如果负载均衡节点宕机等不能工作的情况,即使后端服务都正常,也将不能正常访问,给实际工作带来巨大的影响。
我们可以使用nginx和keepalived的组合实现双机主备,提高服务的可靠性。
1. 基本架构图
正常情况下nginx主节点会工作,将流量转发到后端服务器中,如果主节点宕机或nginx本身故障,备节点将被启用进行工作,确保服务的稳定性和可靠性。
2. 节点规划
在这种场景中,只需要对外暴露虚拟ip,不需要暴露真实的方向代理服务器ip和真实服务器ip。
3. 部署keepalived
以下操作在反向代理服务器节点执行。
下载并安装keepalived
yum install -y keepalived
修改配置
# 在 11.0.1.10 节点执行
cat >/etc/keepalived/keepalived.conf<<"EOF"
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "ss -tulnp | grep ':80'" # 用于对nginx端口的检查
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 11.0.1.10
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
11.0.1.60
}
track_script {
chk_nginx
}
}
EOF
# 在 11.0.1.11 节点执行
cat >/etc/keepalived/keepalived.conf<<"EOF"
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "ss -tulnp | grep ':80'" # 用于对nginx端口的检查
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 11.0.1.11
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
11.0.1.60
}
track_script {
chk_nginx
}
}
EOF
说明:在一个局域网中,`virtual_router_id`必须相同,它能让keepalived自动探测到相关联的服务器。`state`有`MASTER`和`BACKUP`的区别,分别表示主节点和从节点。`11.0.1.60`为节点规划中的虚拟ip。
启动keepalived服务
systemctl daemon-reload
systemctl enable --now keepalived
启动完之后可通过`ip addr`命令查看各主机ip的变化。
除了`11.0.1.10`,还多了`11.0.1.60`的虚拟ip,如果发生宕机等事故,虚拟ip会漂移到`11.0.1.11`的节点,而不至于停止服务。
测试连通性
ping -c 4 11.0.1.60
4. 修改nginx配置
vi /usr/local/nginx/conf/nginx.conf
upstream fzjh{
server 11.0.1.50:8080;
server 11.0.1.51:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://fzjh;
}
}
两台主备的配置完全一致。
5. 访问测试
http://11.0.1.60/
6. 主节点nginx进程故障访问测试
# 在 nginx 主节点执行
/usr/local/nginx/sbin/nginx -s stop
虚拟ip已成功漂移。
访问依旧不受影响。