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