nginx+keepalive實現高可用熱備負載均衡

1、負載均衡是什麼(摘自百度百科)
linux

        負載均衡 創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。nginx

        負載均衡,英文名稱爲Load Balance,其意思就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。web

2、經常使用的負載均衡後端

    一、HTTP重定向瀏覽器

        HTTP 重定向能夠將 HTTP 請求進行轉移,在 Web 開發中咱們常常會用它來完成自動跳轉,好比用戶登陸成功後跳轉到相應的管理頁面。 這種重定向徹底由HTTP 定義,而且由HTTP 代理和Web 服務器共同實現。很簡單,當HTTP 代理(好比瀏覽器)向Web服務器請求某個URL後,Web 服務器能夠經過HTTP 響應頭信息中的Location 標記來返回一個新的URL,這意味着HTTP代理須要繼續請求這個新的URL ,這便完成了自動跳轉。固然,若是你本身寫了一個 HTTP 代理,也能夠不支持重定向,也就是對於Web 服務器返回的Location 標記視而不見,雖然這可能不符合HTTP 標準,但這徹底取決於你的應用須要。 也正是由於HTTP 重定向具有了請求轉移和自動跳轉的本領,因此除了知足應用程序須要的各類自動跳轉以外,它還能夠用於實現負載均衡,以達到Web 擴展的目的。bash

    二、DNS負載均衡服務器

        DNS負責提供域名解析服務,當咱們訪問某個站點時,實際上首先須要經過該站點域名的DNS服務器來獲取域名指向的IP 地址,在這一過程當中,DNS服務器完成了域名到IP 地址的映射,一樣,這種映射也能夠是一對多的,這時候,DNS 服務器便充當了負載均衡調度器(也稱均衡器),它就像前面提到的重定向轉移策略同樣,將用戶的請求分散到多臺服務器上,可是它的實現機制徹底不一樣。網絡

    三、反向代理負載均衡 負載均衡

        反向代理服務器的核心工做即是轉發 HTTP 請求,所以它工做在 HTTP 層面,也就是 TCP 七層結構中的應用層(第七層),因此基於反向代理的負載均衡也稱爲七層負載均衡,實現它並不困難,目前幾乎全部主流的 Web 服務器都熱衷於支持基於反向代理的負載均衡。tcp

    四、IP負載均衡 

        事實上,在數據鏈路層(第二層)、網絡層(第三層)以及傳輸層(四層)均可以實現不一樣機制的負載均衡,但有所不一樣的是,這些負載均衡調度器的工做必須由Linux 內核來完成,由於咱們但願網絡數據包在從內核緩衝區進入進程用戶地址空間以前,儘早地被轉發到其餘實際服務器上,沒錯,Linux 內核固然能夠辦獲得,位於內核的Netfilter和IPVS能夠解決問題,而用戶空間的應用程序對此卻一籌莫展。 另外一方面,也正是由於能夠將調度器工做在應用層如下,這些負載均衡系統能夠支持更多的網絡服務協議,好比FTP 、SMTP 、DNS ,以及流媒體和VoIP 等應用。

3、規劃和準備

        兩臺相同配置的web

用途 IP
MASTER 192.168.1.100
BACKUP 192.168.1.101

4、安裝

        兩臺接入服務器分別安裝nginX和keepalived

        準備依賴包

        yum -y install gcc pcre-devel zlib-devel openssl-devel popt-devel

        下載

        wget http://nginx.org/download/nginx-1.8.1.tar.gz

        wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

        安裝nginx

        安裝keepalived

        tar zxvf keepalived-1.2.19.tar.gz

        cd keepalived-1.2.19

        ./configure

        make && make install

        cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

        cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

        mkdir /etc/keepalived

        cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

        cp /usr/local/sbin/keepalived /usr/sbin/

        加入啓動服務

        echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local

        echo "/etc/init.d/keepalived start" >> /etc/rc.local

5、配置

    一、配置nginx

        兩臺接入服務器的nginx的配置徹底同樣,主要是配置/usr/local/nginx/conf/nginx.conf的http。其中多域名指向是經過虛擬主機(配置http下面的server)實現;同一域名的不一樣虛擬目錄經過每一個server下面的不一樣location實現;到後端的服務器在http下面配置upstream,而後在server或location中經過proxypass引用。要實現前面規劃的接入方式,http的配置以下:

    ......

    upstream opslinux.com {

            #ip_hash;                                    # ip_hash只取ip地址的前三段進行hash,不方便測試,故關掉

          server 192.168.1.102:80;

          server 192.168.1.103:80;

          server 192.168.1.104:80;

    }

    server {

            listen       80;

            server_name  opslinux.com;

            location / {

                proxy_pass http://opslinux.com;

            }

    }

    ......

    驗證方法:

    首先用IP訪問前表中各個應用服務器的url

    再用域名和路徑訪問前表中各個應用系統的域名/虛擬路徑

    二、配置keepalived

        按照上面的安裝方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、從服務器的配置相關聯但有所不一樣。以下:

    Master:

        ! Configuration File for keepalived

         global_defs {

            router_id NGINX_DEVEL

         }

        vrrp_instance VI_1 {

           state MASTER

            interface eth0

            virtual_router_id 51

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

           }

           virtual_ipaddress {

                192.168.1.100

           }

        }

    Backup:

        ! Configuration File for keepalived

        global_defs {

          router_id NGINX_DEVEL

        } 

        vrrp_instance VI_1 {

            state BACKUP

            interface eth0

            virtual_router_id 61

            priority 99

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

            }

            virtual_ipaddress {

               192.168.1.100

            }

        }

    驗證方法:

        前後在主、從服務器上啓動 keepalived: service keepalived start

        在主服務器上查看是否已經綁定了虛擬IP: ip addr

        中止主服務器上的keepalived: service keepalived stop 而後在從服務器上查看是否已經綁定了虛擬IP;

        啓動主服務器上的keepalived看看主服務器可否從新接管虛擬IP

    三、keepalived 監控 nginx 的狀態(MASTER)

        通過前面的配置,若是主服務器的keepalived中止服務,從服務器會自動接管VIP對外服務;一旦主服務器的keepalived恢復,會從新接管VIP。 但這並非咱們須要的,咱們須要的是當NginX中止服務的時候可以自動切換。

        keepalived支持配置監控腳本,咱們能夠經過腳本監控NginX的狀態,若是狀態不正常則進行一系列的操做,最終仍不能恢復NginX則殺掉keepalived,使得從服務器可以接管服務。

    如何監控NginX的狀態

        最簡單的作法是監控NginX進程,更靠譜的作法是檢查NginX端口,最靠譜的作法是檢查多個url可否獲取到頁面。

    如未嘗試恢復服務

        若是發現NginX不正常,重啓之。等待3秒再次校驗,仍然失敗則再也不嘗試。

        cd /opt

        vi chk_nginx.sh

        根據上述策略很容易寫出監控腳本。這裏使用nmap檢查nginx端口來判斷nginx的狀態,記得要首先安裝nmap。監控腳本以下:

        #!/bin/bash

        # check nginx server status

        NGINX=/usr/local/nginx/sbin/nginx

        PORT=80

         

        nmap localhost -p $PORT | grep "$PORT/tcp open"

        #echo $?

        if [ $? -ne 0 ];then

            $NGINX -s stop

            $NGINX

            sleep 3

            nmap localhost -p $PORT | grep "$PORT/tcp open"

            [ $? -ne 0 ] && /etc/init.d/keepalived stop

        fi

        chmod a+x /opt/chk_nginx.sh                #設置腳本的執行權限

        則 keepalived.conf中增長以下配置:

    主 keepalived

        vrrp_script chk_http_port {

            script "/opt/chk_nginx.sh"

            interval 1

            weight -2

        }

        track_script {

            chk_http_port

        }

        例子:

        ! Configuration File for keepalived

        global_defs {

           router_id NGINX_UPSTEAM

        }

        vrrp_script chk_http_port {

            script "/opt/chk_nginx.sh"

            interval 1

            weight -2

        }

        vrrp_instance VI_1 {

            state MASTER

            interface eth0

            virtual_router_id 51

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

            }

            virtual_ipaddress {

                192.168.1.100

            }

            track_script {

                chk_http_port

            }

        }

    更進一步,爲了不啓動keepalived以前沒有啓動nginx , 能夠在/etc/init.d/keepalived的start中首先啓動nginx(紅色爲新增部分):

        start() {

            /usr/local/nginx/sbin/nginx

            sleep 3

            echo -n $"Starting $prog: "

            daemon keepalived ${KEEPALIVED_OPTIONS}

            RETVAL=$?

            echo

            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

        }

相關文章
相關標籤/搜索