解決方案之關(guān)于Nginx高可用方案
解決方案:Nginx高可用方案
關(guān)鍵詞
- KeepAlived(主服務(wù)器 和 備份服務(wù)器 故障時 IP 瞬間無縫交接)
- VRRP協(xié)議(路由器組,提供虛擬IP,一個master和多個backup,組播消息,選舉backup當master)
- Nginx+keepalived 雙機主主模式(倆公網(wǎng)虛擬IP,負載);雙機主從模式(熱備服務(wù)器)
需求:
由于業(yè)務(wù)擴展,網(wǎng)站的訪問量不斷加大,負載越來越高。現(xiàn)需要在web前端放置nginx負載均衡。
在生產(chǎn)環(huán)境下,Nginx作為流量的入口,如果Nginx不能正常工作或服務(wù)器宕機,將導致整個微服務(wù)架構(gòu)的不可用。
所以結(jié)合keepalived對前端nginx實現(xiàn)HA高可用
一、Nginx & KeepAlived
Nginx 進程基于Master+Slave(worker)多進程模型,自身具有非常穩(wěn)定的子進程管理功能。在Master進程分配模式下,Master進程永遠不進行業(yè)務(wù)處理,只是進行任務(wù)分發(fā),從而達到Master進程的存活高可靠性,Slave(worker)進程所有的業(yè)務(wù)信號都 由主進程發(fā)出,Slave(worker)進程所有的超時任務(wù)都會被Master中止,屬于非阻塞式任務(wù)模型。
KeepAlived是Linux下面實現(xiàn)VRRP備份路由的高可靠性運行件。基于KeepAlived設(shè)計的服務(wù)模式能夠真正做到主服務(wù)器和備份服務(wù)器故障時IP瞬間無縫交接。二者結(jié)合,可以構(gòu)架出比較穩(wěn)定的軟件LB(Load Balance)方案。
KeepAlived的作用是檢測服務(wù)器的狀態(tài),如果有一臺web服務(wù)器宕機,或工作出現(xiàn)故障,KeepAlived將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除,同時使用其他服務(wù)器代替該服務(wù)器的工作,當服務(wù)器工作正常后KeepAlived自動將服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復(fù)故障的服務(wù)器。
KeepAlived是一個基于VRRP協(xié)議來實現(xiàn)的服務(wù)高可用方案,可以利用其來避免IP單點故障,類似的工具還有Heartbeat 、Corosync、Pacemaker。但是它一般不會單獨出現(xiàn),而是與其它負載均衡技術(shù)(如LVS、Haproxy、Nginx)一起工作來達到集群的高可用。
二、VRRP協(xié)議
VRRP全稱 Virtual Router Redundancy Protocol,即”虛擬路由冗余協(xié)議“??梢哉J為它是實現(xiàn)路由器高可用的容錯協(xié)議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組里面有一個master和多個backup,但在外界看來就像一臺一樣,構(gòu)成虛擬路由器,擁有一個虛擬IP(VIP - Virtual IP,也就是路由器所在局域網(wǎng)內(nèi)其他機器的默認路由),占有這個IP的master實際負責ARP相應(yīng)和轉(zhuǎn)發(fā)IP數(shù)據(jù)包,組中的其它路由器作為備份的角色處于待命狀態(tài)。master會發(fā)組播消息,當backup在超時時間內(nèi)收不到vrrp包時就認為master宕掉了,這時就需要根據(jù)VRRP的優(yōu)先級來選舉一個backup當master,保證路由器的高可用。
在VRRP協(xié)議實現(xiàn)里,虛擬路由器使用 00-00-5E-00-01-XX 作為虛擬MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器占用。在虛擬路由器里面的物理路由器組里面通過多播IP地址 224.0.0.18 來定時發(fā)送通告消息。每個Router都有一個 1-255之間的優(yōu)先級別,級別最高的(highest priority)將成為主控(master)路由器。通過降低master的優(yōu)先權(quán)可以讓處于backup狀態(tài)的路由器搶占(pro-empt)主路由器的狀態(tài),兩個backup優(yōu)先級相同的IP地址較大者為master,接管虛擬IP。
三、雙機高可用解決方案
(1)Nginx+keepalived 雙機主從模式:
即前端使用兩臺服務(wù)器,一臺主服務(wù)器和一臺熱備服務(wù)器,正常情況下,主服務(wù)器綁定一個公網(wǎng)虛擬IP,提供負載均衡服務(wù),熱備服務(wù)器處于空閑狀態(tài);當主服務(wù)器發(fā)生故障時,熱備服務(wù)器接管主服務(wù)器的公網(wǎng)虛擬IP,提供負載均衡服務(wù);但是熱備服務(wù)器在主機器不出現(xiàn)故障的時候,永遠處于浪費狀態(tài),對于服務(wù)器不多的網(wǎng)站,該方案不經(jīng)濟實惠。
(2)Nginx+keepalived 雙機主主模式:
即前端使用兩臺負載均衡服務(wù)器,互為主備,且都處于活動狀態(tài),同時各自綁定一個公網(wǎng)虛擬IP,提供負載均衡服務(wù);當其中一臺發(fā)生故障時,另一臺接管發(fā)生故障服務(wù)器的公網(wǎng)虛擬IP(這時由非故障機器一臺負擔所有的請求)。
四、基礎(chǔ)環(huán)境準備
兩臺服務(wù)器:192.168.253.11(主), 192.168.253.12(從),每臺服務(wù)器上分別安裝Nginx 、KeepAlived。
cd /usr/local/openresty/nginx/sbin ./nginx -s stop
(1)安裝Nginx:
# 添加源 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 安裝Nginx sudo yum install -y nginx # 啟動Nginx sudo systemctl start nginx.service # 瀏覽器訪問測試 http://192.168.253.11/ http://192.168.253.12/
(2)安裝KeepAlived可使用yum直接安裝:
yum -y install keepalived
查看KeepAlived配置文件:
cat /etc/keepalived/keepalived.conf
接下來就是要對該配置文件進行修改,該配置文件在/etc/keepalived/路徑下。在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,它是為lvs準備的。
(3)關(guān)閉防火墻(默認關(guān)閉)
(4)關(guān)閉selinux(如果不關(guān)閉,KeepAlived不生效)
臨時關(guān)閉:
[root@localhost ~]# getenforce Enforcing [root@localhost ~]# setenforce 0 [root@localhost ~]# getenforce Permissive
永久關(guān)閉:
[root@localhost ~]# vim /etc/sysconfig/selinux SELINUX=enforcing 改為 SELINUX=disabled 重啟服務(wù)reboot
五、配置主備模式
(1)修改主配置文件:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id master11 } # nginx掛了,實現(xiàn)vip自動漂移,使用如下腳本控制 vrrp_script check_nginx { script "/usr/local/nginx/nginx_check.sh" interval 2 # 機器宕機執(zhí)行的次數(shù) weight 2 } # 當前實例配置 vrrp_instance VI_1 { state MASTER # 主機 interface ens33 # 綁定的網(wǎng)卡 virtual_router_id 51 # 組id,需要一致 priority 100 # 優(yōu)先級 advert_int 1 # 檢查間隔,默認1s # 調(diào)用nginx掛了之后進行vip漂移的函數(shù) track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } # 配置vip virtual_ipaddress { 192.168.253.50/24 dev ens33 label ens33:1 scope global } }
在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,我們這用不到,它是為lvs準備的。
(2)/usr/local/nginx/nginx_check.sh :
# 在/usr/local下新建目錄nginx mkdir nginx # 新建文件 touch nginx_check.sh
# 編輯內(nèi)容 #!/bin/bash A=`ps -C nginx --no-header |wc -l` #查看nginx進程是否存在 #if [ $A -eq 0 ];then /usr/sbin/nginx #重啟nginx if [ $A -eq 0 ];then #nginx重啟失敗 exit 1 # keepalived執(zhí)行腳本,返回非0結(jié)果,ip漂移 else exit 0 # keepalived執(zhí)行腳本,返回0,ip不漂移 fi #else # exit 0 #fi
需要給nginx_check.sh文件加可執(zhí)行權(quán)限:
chmod +x nginx_check.sh
(3)修改從機keepalived.conf配置文件:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id backup } vrrp_script check_nginx { script "/usr/local/nginx/nginx_check.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP # 從機 interface ens33 virtual_router_id 51 # 組id,需要一致 priority 99 # 優(yōu)先級 advert_int 1 # 調(diào)用nginx掛了之后進行vip漂移的函數(shù) track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } # 配置vip virtual_ipaddress { 192.168.253.50/24 dev eth0 label ens33:1 scope global } }
同樣需要在/usr/local/nginx/路徑下放上nginx_check.sh腳本文件。
(4) 啟動nginx、keepalived
#主從啟動 sudo systemctl restart nginx.service #主從啟動 systemctl start keepalived
(5)訪問測試
為效果明顯,可以修改Nginx首頁,將主從IP地址放置首頁以便區(qū)分。
訪問http://192.168.253.50 or curl 192.168.253.50
查看Nginx日志:
cd /var/log/nginx/ cat access.log
查看主服務(wù)器keepalived日志:
Keepalived默認所有的日志都是寫入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 進行查看
查看ens33網(wǎng)卡信息:
ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 inet 192.168.253.11/24 brd 192.168.253.255 scope global noprefixroute ens33 inet 192.168.253.50/24 scope global secondary ens33:1 #VIP已漂移到主機,vip只能選擇一個機器進行綁定
(6)停掉主服務(wù)器的nginx
通過瀏覽器訪問:http://192.168.253.50
查看主機KeepAlived日志:
tail -f /var/log/messages|grep Keepalived
# 強制停止 pkill -9 nginx # 查看Nginx進程 ps -ef | grep nginx # 等待幾秒后再次查看Nginx進程,發(fā)現(xiàn)已經(jīng)通過檢查腳本自啟 # 因為在keepalived腳本中,進行了nginx重啟操作
則會執(zhí)行腳本nginx_check.sh進行nginx啟動!
- 如果master上的nginx服務(wù)掛了,則nginx會自動重啟,重啟失敗后會自動關(guān)閉keepalived,這樣vip資源也會轉(zhuǎn)移到slave上。
- master和slave兩邊都開啟nginx服務(wù),無論master還是slave,當其中的一個keepalived服務(wù)停止后,vip都會漂移到keepalived服務(wù)還在的節(jié)點上;
- 如果要想使nginx服務(wù)掛了,vip也漂移到另一個節(jié)點,則必須用腳本或者在配置文件里面用shell命令來控制。(nginx服務(wù)宕停后會自動啟動,啟動失敗后會會致使vip資源漂移到另一臺機器上)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Nginx的超時keeplive_timeout配置步驟
Nginx 處理的每個請求均有相應(yīng)的超時設(shè)置,本文主要介紹了Nginx的超時keeplive_timeout配置步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Nginx配置反向代理服務(wù)器實現(xiàn)在https網(wǎng)站中請求http資源
?Nginx反向代理?是一種將客戶端請求轉(zhuǎn)發(fā)到后端服務(wù)器的技術(shù),主要用于負載均衡、提高安全性和提升性能,本文給大家介紹了Nginx配置反向代理服務(wù)器實現(xiàn)在https網(wǎng)站中請求http資源,需要的朋友可以參考下2025-03-03