nginx 能够实现负载均衡,但 nginx 自身存在单点故障的问题,这时候最早想到的就是 keepalived,能够解决单点故障的问题nginx
因为没有使用 lvs,因此这里 nginx 之间不存在负载均衡bash
同时,若是 keepalived 的 master 节点 nginx 服务宕了之后,若是 keepalived 还在运行,则用户就访问不到 nginx 服务了,因此须要添加监控脚本,当 nginx 宕机时,杀死本机的 keepalived 服务服务器
这样,keepalived 的 master 就会切换,同时用户访问的 nginx 服务也会切换到原来的 backup 节点负载均衡
RIP | VIP | |
MASTER | 192.168.132.136 | 192.168.132.200 |
SLAVE | 192.168.132.140 | 192.168.132.200 |
yum -y install nginx systemctl start nginx
global_defs { notification_email { chen@test.com } notification_email_from chen@test.com smtp_server smtp.exmail.qq.com smtp_connect_timeout 30 router_id my-slave } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 5 } vrrp_instance my_nginx { state MASTER # BACKUP 节点这里配置成 BACKUP interface ens37 virtual_router_id 51 priority 200 # BACKUP 节点配置要比该值小 advert_int 1 # vrrp_script定义的chk_nginx须要放到vrrp_instance里,用track_script指定,才能执行 track_script { chk_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.132.200/24 dev ens37 label ens37:200 } }
#!/bin/bash # 注意,整个脚本的执行时间必须小于keepalived中定义的时间间隔,即interval定义的时间,不然下次执行脚本时,会杀死上次正在执行的脚本 systemctl status nginx &> /dev/null # 检查nginx状态,nginx正常运行,$?为0,不然为非零数 if [ $? -ne 0 ];then systemctl start nginx # 启动nginx后等待2s,保证nginx已经正常启动运行,若是nginx还未正常运行,则关闭keepalived服务,使用备用keepalived sleep 2 systemctl status nginx &> /dev/null if [ $? -ne 0 ];then systemctl stop keepalived fi fi
服务器 | 内网 | 外网 |
A | 192.168.10.30 | 118.110.20.14 |
B | 192.168.10.40 |
[admin@test ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens160 # 其中大部分配置都不是必须的,只须要能保证网卡能正常启动且不包含IP便可 HWADDR=00:50:56:8b:72:14 NAME=ens160 # GATEWAY=118.110.20.12 # NETMASK=255.255.255.240 # IPADDR=118.110.20.14 DNS1=8.8.4.4 DNS2=8.8.8.8 DOMAIN=example DEVICE=ens160 ONBOOT=yes USERCTL=no BOOTPROTO=static PEERDNS=no check_link_down() { return 1; }
# 这里只列出了主要部分,其余部分按照前面的例子来便可 vrrp_instance my_nginx { state MASTER interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名 virtual_router_id 51 priority 100 advert_int 1 track_script { chk_nginx } authentication { auth_type PASS auth_pass 111111 } virtual_ipaddress { 118.110.20.14/28 dev ens160 # 这里配置和上面的例子不同,至关于直接配置ens160网卡,没用到label } virtual_routes { default via 118.110.20.12 # 这里配置默认路由 } }
Cannot find an IP address to use for interface
[root@test sites]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 HWADDR=00:50:56:8b:0e:60 NAME=ens160 GATEWAY=118.110.20.12 DNS1=8.8.4.4 DNS2=8.8.8.8 DOMAIN=example DEVICE=ens160 ONBOOT=yes USERCTL=no BOOTPROTO=static NETMASK=255.255.255.240 IPADDR=118.110.20.14 PEERDNS=no check_link_down() { return 1; }
vrrp_instance my_nginx { state BACKUP interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名 virtual_router_id 51 priority 100 advert_int 1 track_script { chk_nginx } authentication { auth_type PASS auth_pass 111111 } notify_master /etc/keepalived/script/master.sh notify_backup /etc/keepalived/script/backup.sh }
#!/bin/bash ifconfig | grep 118.110.20.14 if [ $? -ne 0 ];then ifconfig ens160 up fi
#!/bin/bash # 即便已经关闭了,再执行该命令也不会有报错,因此不用作断定 ifconfig ens160 down