寫給後端的Nginx初級入門教程:配置高可用集羣

在上一篇寫給後端的Nginx初級入門教程:實戰篇文章中咱們從實際的代碼出發,比較粗略地講解了Nginx配置文件的結構,以及經常使用的功能好比複雜均衡,反向代理,動靜分離的簡單配置,事情到這裏就結束了嗎,固然沒有,就拿負載均衡爲例,還記得咱們基礎篇關於反向代理給的那張圖嗎?咱們將它作一個小小的修改,變成咱們的負載均衡圖,以下圖所示:linux

剛開始這麼一看,也沒發現什麼問題啊,請求通過咱們的負載均衡服務器,經過不一樣的策略分發到不一樣的服務器上進行處理,就算一臺服務器掛了,也會有其餘的服務器繼續頂上,這個邏輯簡直滿分有木有,媽媽不再用擔憂巨大的請求把個人服務器累崩啦。nginx

等等,看似平靜的湖面下面其實每每波濤洶涌,知識點吶,朋友們,面試可能要考的git

但是,,萬一,,咱們負載均衡服務器掛了,,那不就完全GG了?github

臥槽,臥槽,臥槽,我怎麼沒有想到,那怎麼辦?面試

別慌,上有上策,下有對策,兵來將擋,水來土掩,爲了防止這種被人掐脖子狀況的發生,就有人提供了另一種思路,是什麼呢? 其實很簡單,你原來不是隻有一個負載均衡服務器麼,掛了玩不起,我弄兩臺負載均衡服務器不就得了,一臺掛了,我繼續用另一臺不就行了嗎,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,臭弟弟,沒招了吧,因而上面的那張圖就變成了這樣:shell

當咱們向服務端發起請求的時候,用的地址並非咱們配置的兩臺Nginx服務器的IP地址,而是咱們設置的虛擬IP地址,而兩臺Nginx服務器的地址則稱爲咱們的工做IP,當好比5個請求(看我這沒見過大場面的樣子)來到咱們的主Nginx服務器,咱們主Nginx服務器一看來了這麼多請求,因而。數據庫

啊,好多請求,我死了。後端

而後,因爲兩臺Nginx服務器都是設置的這一個虛擬IP,當主Nginx服務器掛了以後,當咱們再次訪問的時候,實際上就是訪問咱們的從Nginx服務器來作具體的負載均衡了,具體提供服務的IP地址也從主Nginx服務器的IP切換到了從Nginx服務器的Ip,整個IP切換的過程對於用戶來講是無感知的,其實有點相似於咱們常常說的主從數據庫。centos

而後整個工做IP地址變化的過程,業界起了一個特cool的名字,叫IP漂移瀏覽器

固然,這個虛擬IP也不是說句話就配置好的,一樣也須要第三方軟件的支持,在這裏咱們使用的是keepalived這個軟件來保證咱們的nginx實現高可用集羣配置的。

keepalived是什麼?

keepalived是集羣管理中保證集羣高可用的一個服務軟件,其功能相似於heartbeat,主要用來防止單點故障。

你這不是脫褲子xx,畫蛇添足嗎,是,Nginx服務器掛了是沒事了,但是你keepalived掛了怎麼辦?

臥,我早就想到可能會有人問這個問題,首先,咱們的keepalived只是簡單的作一個負載均衡的做用,真實的請求仍是交給Nginx來負責的,因此,keepalived掛的機率要遠遠小於Nginx掛的機率,若是真掛了,那也真的沒辦法了。

說了這麼多,具體怎麼玩?好,那接下來,咱們不廢話,直接看東西。

keepalived安裝及配置文件詳解:

keepalived安裝:

既然咱們說的是nginx高可用集羣的配置,首先,有不少先決條件咱們得有吧,集羣集羣,你只有一臺linux服務器搞不成啊,固然也不要求你準備幾十臺服務器出來,兩臺就好,畢竟成本高昂,固然對於朱一旦那樣的勞力士男人這點服務器並不在話下,其次,最最最基本的,咱們兩臺服務器要把Nginx裝好,具體Nginx怎麼裝的,能夠去看我以前的實戰篇,因此爲了實現Nginx的高可用集羣配置,咱們須要準備:

  • 服務器兩臺,我這裏是本地虛擬機,IP分別是192.168.17.119192.168.17.120
  • 咱們兩臺服務器都須要安裝好nginxkeepalived

過程略,騙你的,按照咱們以前的習慣,這裏只列舉最簡單的安裝方法,打開咱們兩臺虛擬機的命令行終端,輸入yum命令進行安裝:

yum install keepalived –y
複製代碼

keepalived配置文件詳解:

裝好了以後呢,就是說配置了,咱們keepalived的配置文件在哪呢?一般來講在etc/keepalived/keepalived.conf這個文件下,咱們打開這個文件,因爲內容實在太多,我這裏就不一一列舉了,可是這麼多的配置並不都是須要我咱們去配置的,相反,咱們簡單的配置主從Nginx服務器只須要其中的一小部分就能夠了,因而呢,咱們對keepalived.conf這個文件進行精簡,精簡事後的內容以下,你們能夠直接把這部份內容替換掉原來的配置文件:

! Configuration File for keepalived

global_defs {
    
    ##郵件相關的配置
    notification_email {
    ###設置報警郵件地址,能夠設置多個,每行一個。 需開啓本機的sendmail服務
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    #keepalived在發生諸如切換操做時須要發送email通知地址,表示發送通知的郵件源地址是誰  
    notification_email_from Alexandre.Cassen@firewall.loc
    #指定發送email的smtp服務器  
    smtp_server 192.168.17.129
    #設置鏈接smtp server的超時時間 
    smtp_connect_timeout 30
    
    ##這個比較重要, router_id 用來標識咱們這臺主機,故障發生時,發郵件時顯示在郵件主題中的信息
    router_id Master_Nginx 
}
 ##檢測腳本和權重參數
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" ##配置腳本的路徑
    interval 2 #(檢測腳本執行的間隔)
    weight 2 ##權重
}

vrrp_instance VI_1 {

    #指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器。注意這裏的state指      定 instance(Initial)的初始狀態,就是說在配置好後,這臺服務器的初始狀態就是這裏指定的,  
    #但這裏指定的不算,仍是得要經過競選經過優先級來肯定。若是這裏設置爲MASTER,但如若他的優先級不及另一       臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,  
    #那麼他會就回搶佔爲MASTER   
    state MASTER  # 備份服務器上將 MASTER 改成 BACKUP 
    
    interface eth0 ###指定HA監測網絡的接口。與本機 IP 地址所在的網絡接口相同,可經過ip addr 查看
    virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的  
    priority 100 # 主、備機取不一樣的優先級,主機值較大,備份機值較小,通常來講,主100 備 80
    advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒     
	authentication { #設置驗證類型和密碼。主從必須同樣
        auth_type PASS   #設置vrrp驗證類型,主要有PASS和AH兩種  
        auth_pass 123456 #設置vrrp驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊  
}

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    } 


}
複製代碼

在咱們本例子中,配置文件主要分爲三大塊,分別是global_defsvrrp_script chk_http_port

vrrp_instance VI_1,下面咱們一個一個來講明它們具體在其中起到的做用:

global_defs 塊:

全局配置,郵件通知等配置都在這裏完成,比較重要的是這個router_id 這個選項,他用來標識咱們這臺主機,

那本例中Master_Nginx 是怎麼來的呢,在個人host文件中:

127.0.0.1 Master_Nginx
複製代碼

固然Master_Nginx 是我本身取的,你們也能夠根據本身的習慣給本身的主機起名字。

vrrp_script chk_http_port 塊:

看到script ,這不是腳本的意思麼,是的,這一塊呢,就主要是們的keepalived腳本配置,以前不是說了嗎,我得有個方法知道你Nginx服務器掛了啊,這樣我才能去切換成備用的服務器,這個腳本就是幹這個事兒的。具體每一行是什麼意思,看註釋:

##檢測腳本和權重參數
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" ##配置腳本的路徑
    interval 2 #檢測腳本執行的間隔,腳本每隔兩秒執行一次,
    weight 2 ##權重,這個權重是什麼意思呢,就是當咱們主Nginx服務器掛了以後,就把該服務器的權重設置成2
}
複製代碼

而nginx_check.sh中的內容,咱們會在配置文件的最後會貼出來。

vrrp_instance VI_1塊:

第三塊就比較重要了,這個主要用來咱們虛擬IP的配置,具體的解釋呢,我已經放在了上文代碼註釋中,惟一須要額外補充的一點是什麼呢,virtual_ipaddress 咱們的虛擬IP地址是能夠有多個的,好比我有兩個虛擬IP怎麼寫,直接換行就行:

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    192.168.17.51 
    } 
複製代碼

附:

在/usr/local/src/ 路徑下建立咱們的nginx_check.sh 腳本。

腳本內容大體意思是,當咱們發現咱們當前nginx服務器掛了的時候,就順便把keepalived也乾沒了,由於咱們兩臺nginx服務器都同時裝了keepalived,一臺掛了,因此天然就切換到另一臺備用服務器上了,這跟古代皇帝駕崩了,重任天然就落到太子身上是一個道理。

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi
複製代碼

弄完以後,記得這個腳本的路徑要和配置文件中 script 值一致,別回來寫好了keepalived找不着。

講到這裏,就已經把keepalived配置文件比較簡單的部分講完了,你們千萬不要說看了個人教程以後覺得學到了所有精髓,其實沒有,這只是一部分,後面更多詳細的配置須要你們在往後的使用過程當中學習和了解。

配置高可用集羣實戰:

其實,在上面講解配置文件的過程當中,咱們已經不知不覺間把咱們主Nginx服務器的keepalived給悄咪咪配置好了,是吧,簡單的配置其實沒那麼複雜的,下面就是配置咱們的備用Nginx服務器了。大致上步驟依然是同樣的。

依舊是替換咱們的配置文件,不過須要你們主要的是,備用Nginx服務器和主Nginx服務器配置文件仍是有那麼一點點須要改動的地方,在本例中主要須要將 state 從MASTER 改成 BACKUP ,優先級 priority 從100 改成 90 ,改過以後的內容以下:

vrrp_instance VI_1 {
    state BACKUP   # 備份服務器上將 MASTER 改成 BACKUP 
    interface eth0 ##網卡,能夠從ipconfig這個命令查到
    virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
    priority 90 # 主、備機取不一樣的優先級,主機值較大,備份機值較小,通常來講,主100 備 80
    advert_int 1 ##心跳,秒,每隔一秒發送一個心態確認咱們的Nginx服務器的存活狀況
	authentication { ##密碼驗證
        auth_type PASS
        auth_pass 123456
}

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    } 

}
複製代碼

腳本內容是不須要修改的,直接上傳到指定目錄就行。

配置過程當中須要注意的是,主服務器和備服務器之間的虛擬IP 地址也就是virtual_ipaddress 必定要是同一個。

測試:

#兩臺服務器分別啓動nginx
nginx
 #分別啓動keepalived 服務
#centos 7 
systemctl start keepalived.service
#centos 6+
service keepalived start
複製代碼

在瀏覽器地址輸入192.168.17.50 ,能夠看到咱們熟悉的Nginx歡迎界面。

爲了驗證keepalived在其中確實是起了做用的,咱們手動把主Nginx服務器的keepalived和nginx服務關掉,而後再訪問192.168.17.50

因而咱們發現依然是能夠正常訪問的,熟悉的Nginx界面又出如今了咱們眼中,可見咱們的備用Nginx服務器排上用場了。

到這裏就大功告成啦。

下面開始技術總結:

本篇文章呢,咱們經過使用keepalived簡單實現了Nginx服務的高可用集羣的配置,雖然配置很簡陋,可是對於初學者我想已經能夠實現經過keepalive和Nginx來實現本身項目的高可用運行了。但這並不意味着這就是所有,keepalived同時支持雙主模式,礙於本文的篇幅,這裏就不額外補充了,可是掌握了主備模式的配置,對於雙主模式的配置我想也是很容易學會的事情,最後,很是感謝閱讀本篇文章的小夥伴們,可以幫助到大家對於我來講是一件很是開心的事兒,若是有什麼疑問或者批評歡迎留言到本篇文章下方,有時間的話我會一一回復。

韓數的學習筆記目前已經悉數開源至github,必定要點個star啊啊啊啊啊啊啊

萬水千山老是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)

相關文章
相關標籤/搜索