一、基本概念
Nginx集群是通过将多个Nginx服务器组合在一起,以协同工作来处理和分发传入的网络流量和请求的系统。集群中的每个Nginx节点都负责处理一部分请求,从而分担负载,提高性能、可伸缩性和可用性。Nginx集群通常用于构建高效的、分布式的Web应用架构。
二、基础环境
nginx 版本:俩台服务器同版本v1.25.3
[root
nginx version: nginx/1.25.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1d 10 Sep 2019
TLS SNI support enabled
configure arguments: --without-http_gzip_module --with-http_ssl_module --with-http_stub_status_module --with-http_v2_module --with-file-aio --with-openssl=/usr/local/gmssl --with-cc-opt=-I/usr/local/gmssl/include --with-ld-opt=-lm
Nginx-Master:192.168.1.137
Nginx-Slave: 192.168.1.138
虚拟IP(用户实际访问IP):192.168.1.50
俩台服务器的前端文件保持一致。
三、配置流程
1、安装keepalived工具
2、配置keepalived,主要是权重优先级pri不同
Master上keepalived配置如下:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
# 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置
interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 # 绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
authentication { # 心跳检测需要的密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
}
}
Slave上keepalived配置如下:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
# 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置
interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 # 绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
authentication { # 心跳检测需要的密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
}
}
3、配置nginx服务检测脚本
vim /usr/local/src/nginx_check.sh
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #Nginx启动命令的位置
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
或者使用
while true; do
# 检测Nginx进程
nginx_process_count=$(ps -C nginx --no-header |wc -l)
# 判断Nginx进程是否存在
if [ $nginx_process_count -eq 0 ]; then
echo "Nginx进程不存在,正在停止keepalived.service服务..."
systemctl stop keepalived.service
break # 退出循环,因为服务已被停止
else
echo "Nginx进程存在,正在启动keepalived.service服务..."
systemctl start keepalived.service
break # 退出循环,因为服务已被启动
fi
sleep 2 # 暂停2秒钟再次检测
done
使该脚本保持后台运行监测:nohup sh nginx_check.sh &
4、重启keepalived和nginx
systemctl start keepalived.service
systemctl restart keepalived.service
systemctl status keepalived.service
nginx -s reload
四、验证测试
1、确认2台主机keepalived和nginx都属于启动状态,并查看网卡信息。
可以发现当前master主机的IP地址为192.168.1.138
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.138/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 1717sec preferred_lft 1717sec
inet 192.168.1.50/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ab04:d981:54a0:9f52/64 scope link noprefixroute
valid_lft forever preferred_lft forever
模拟Master宕机,# poweroff
此时再次查看192.168.1.137信息,可以发现137主机称为Master
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.137/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 1376sec preferred_lft 1376sec
inet 192.168.1.50/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ab04:d981:54a0:9f52/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::460b:fc4:bde5:73ec/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2、模拟Master-2:192.168.1.138恢复
可以看到192.168.1.138重新成为Master
证明故障移配置完成。
五、小结
本篇内容keepalived结合nginx实现故障转移的前提条件时俩个服务都挂掉,比如服务器宕机的情况发生,方能实现故障转移。
如果只是单独的nginx挂掉,则会通过脚本重启nginx,而不会实现故障转移。