本文介绍nginx高可用集群的搭建。利用keepalived实时检查nginx进程是否存活、keepalived的虚拟ip技术,达到故障转移的目的。终端用户通过访问虚拟ip,感知不到实际发生的故障。架构图如下:
0、环境
- Ubuntu:22.04.2 lts
- nginx: 1.18.0
- keepalived:2.2.4
- 虚拟机:vmware
1、规划
分别新建两个虚拟机,虚拟机的ip和端口规划如下:
序号 | ip | port | 虚拟ip | 默认 |
---|---|---|---|---|
A | 192.169.99.100 | 80 | 192.168.99.180 | 主 |
B | 1921.68.99.120 | 80 | 192.168.99.180 | 备 |
注意:虚拟ip就是我们后期统一的访问地址。
2、结点A安装nginx
sudo apt install nginx
等待安装完成,再启动:
sudo systemctl start nginx
虚拟机验证是否安装成功:
curl http://localhost/
宿主机浏览器验证,http://192.168.99.100/,效果如下:
宿主机如果访问成功,说明虚拟机1上的nginx搭建成功。
2.1、修改nginx首页
为了便于测试,我们修改一下首页。打开nginx.conf(位于/etc/nginx),找到server 80的配置段,如果找不到80的配置段,仔细看看include配置。通过一系列的跟踪,我这里nginx首页的位置在: /var/www/html/index.nginx-debian.html 。
打开这个文件,最后加一句,能让我们看出区别就行。
3、结点B安装nginx
结点B安装nginx和A相同,此处不在赘述。记得安装完成后,通过宿主机浏览器访问一下对应的地址,有成功提示,则说明安装成功。
4、结点A安装keepalived
sudo apt install keepalived
等待安装完成。
4.1、配置
cd /etc/keepalived
# 看一下有没有keepalived.conf文件,没有就新建。
sudo vim keepalived.conf
keepalived.conf文件配置如下:
# Configuration File for keepalived
global_defs {
router_id keepalived_01 # 名字自己起
}
vrrp_script chk_nginx {
# 具体的脚本,后面有具体内容,功能就是检查nginx进程是否存在,不存在就启动
script "/etc/keepalived/nginx_check.sh"
interval 2 # 2s执行一次
weight -20 # 失败一次 则优先级 -20
}
vrrp_instance VI_1 {
state MASTER # 主机
interface ens33 # 网卡名字,不知道就ifconfig看一下
virtual_router_id 41 # 保证唯一,并且与备机一致
priority 100
advert_int 1
authentication {
auth_type PASS # 验证类型, 与备机一致
auth_pass 1234 # 密码, 与备机一致
}
virtual_ipaddress {
192.168.99.180 # 虚拟地址,主、备机入口,必须一致
}
# 指定脚本
track_script {
chk_nginx
}
nginx_check.sh的脚本代码:
#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
# 尝试启动一次
systemctl start nginx
# 再次检查ngixn 进程
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
# 关闭 keepalived
systemctl stop keepalived
fi
fi
4.2、启动keepalived
sudo systemctl start keepalived
5、结点B安装keepalived
结点B和A安装和配置完全一样,此处不再赘述。
6、测试
访问虚拟ip,http://localhost:80/, 效果如下:
关闭A机的nginx,刷新浏览器,发现效果如上图。原因是,我们的脚本里检查nginx进程是否存在,不存在就重启。我们直接关闭A主机,再次刷新浏览器,效果如下:
达到了我们故障转移的目的。
OK,就这样了,有问题给我留言,我们共同进步。