超詳細的Nginx負載均衡+高可用配置(親測附圖)

環境準備

準備兩臺主機並且都裝有Nginx和Apache或者Tomcat
我的第一個主機A的ip:-.-.-.244;第二個主機B的ip:-.-.-.17
在主機A和主機B的apache訪問目錄(默認是/var/www/html)下放測試代碼loadBalanceTest.html,內容分別爲【I am -.-.-.244 server】、 【I am -.-.-.17 server】
環境測試
訪問主機B,看到如下頁面則說明環境可用,A主機同樣的方式。
在這裏插入圖片描述

配置反向服務代理器

打開A主機的Nginx配置文件,在http模塊內server模塊外添加代碼
在這裏插入圖片描述
重啓A主機的Nginx,【systemctl reload nginx】,在瀏覽器上訪問A主機的loadBalanceTest.html
在這裏插入圖片描述
可以看到,訪問的實際上是B主機上的loadBalanceTest.html頁面

配置負載均衡

在A和B兩臺主機上做相同的如下配置
在這裏插入圖片描述
在這裏插入圖片描述
現在分別訪問三次A主機和B主機都會出現的情況是:I am -.-.-.244 server連續出現兩次,第三次是I am -.-.-.17 server,此後的刷新都是按照該規律

搭建Keepalived:(Keepalived需要依賴openssl)

1.下載源碼包到/usr/local/keepalived目錄

wget http://www.keepalived.org/software/keepalived-2.0.15.tar.gz  //2019年4月前的最新版本

2.解壓

tar zxvf keepalived-2.0.15.tar.gz

在這裏插入圖片描述
3.安裝依賴插件

yum install -y gcc openssl-devel popt-devel

4.編譯安裝

cd keepalived-2.0.15
#指定安裝目錄
./configure --prefix=/usr/local/keepalived
#編譯 安裝
make && make install

在這裏插入圖片描述
5.運行前配置

cp /usr/local/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/

mkdir /etc/keepalived

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

cp /usr/local/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

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

使用systemctl start keepalived命令啓動服務時,默認會將/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS參數作爲keepalived服務啓動時的參數,並從/etc/keepalived/目錄下加載keepalived.conf配置文件,或用-f參數指定配置文件的位置。
在這裏插入圖片描述
防止出現腦裂現象(主備同時獲取了VIP地址)

# 指定keepalived配置的網卡:eth0,固定的VRRP廣播地址:224.0.0.18
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

# 查看配置的規則
firewall-cmd --direct --get-rules ipv4 filter INPUT
firewall-cmd --direct --get-rules ipv4 filter OUTPUT

啓動

systemctl start keepalived

查看啓動情況

ps -aux |grep keepalived

在這裏插入圖片描述
查看啓動狀態

systemctl status keepalived

在這裏插入圖片描述
查看vip
在這裏插入圖片描述
查看啓動日誌

journalctl -xe

查看keepalived日誌

tail -f  /var/log/messages

讓keepalived監控Nginx的狀態來搭建keepalived+Nginx實現負載均衡

進入A主機的目錄/etc/keepalived,把已經存在的keepalived.conf改爲其他名字,然後重新生成一個名爲keepalived.conf的文件,內容如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一個沒有重複的名字即可
  5     router_id server_master
  6 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此處不設置爲MASTER,代表主服務器
 15     state MASTER
 16 # 網卡名字
 17     interface eth0
 18 # 同一個keepalived集羣的virtual_router_id相同
 19     virtual_router_id 51
 20 # 權重,master要大於slave
 21     priority 100
 22 # 主備通訊時間間隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28 #虛擬ip,隨便寫一個沒有被用到的ip,可以直接用keepalived.conf默認vip中的一個
 29     virtual_ipaddress {
 30         192.168.200.16
 31     }
 36 }

在B主機做同樣的操作,keepalived.conf內容如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一個沒有重複的名字即可
  5     router_id server_slave
  6 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此處不設置爲MASTER,代表主服務器
 15     state BACKUP
 16 # 網卡名字
 17     interface eth0
 18 # 同一個keepalived集羣的virtual_router_id相同
 19     virtual_router_id 51
 20 # 權重,master要大於slave
 21     priority 99
 22 # 主備通訊時間間隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28 #虛擬ip,隨便寫一個沒有被用到的ip,可以直接用keepalived.conf默認vip中的一個
 29     virtual_ipaddress {
 30         192.168.200.16
 31     }
 36 }

這樣,如果主服務器的keepalived停止服務,從服務器會自動接管VIP對外服務;一旦主服務器的keepalived恢復,會重新接管VIP。
驗證:
(1)先後在主、從服務器上啓動keepalived;
(2)在主服務器上查看是否已經綁定了虛擬IP: ip addr;
(3)停止主服務器上的keepalived,然後在從服務器上查看是否已經綁定了虛擬IP:
(4)啓動主服務器上的keepalived,看看主服務器能否重新接管虛擬IP。

但這我們需要的是當NginX停止服務的時候能夠自動切換。
keepalived支持配置監控腳本,我們可以通過腳本監控Nginx的狀態,如果狀態不正常則進行一系列的操作,最終仍不能恢復Nginx則殺掉keepalived,使得從服務器能夠接管服務。
讓keepalived監控Nginx的狀態最簡單的做法是監控Nginx進程,更靠譜的做法是檢查Nginx端口,最靠譜的做法是檢查多個url能否獲取到頁面。

嘗試恢復服務的做法爲:如果發現NginX不正常,重啓之。等待3秒再次校驗,仍然失敗則不再嘗試。

這裏使用nmap檢查nginx端口來判斷nginx的狀態
安裝nmap

yum install nmap

生成監控腳本文件

#創建nginx檢測腳本
#touch nginx_check.sh

#給腳本增加可執行權限
#chmod +x nginx_check.sh

內容如下

  1 #! /bin/bash
  2 # check nginx server status
  3 NGINX=/usr/sbin/nginx
  4 PORT=80
  5 nmap localhost -p $PORT | grep "$PORT/tcp open"
  6 #echo $?
  7 if [ $? -ne 0 ];then
  8     $NGINX -s stop
  9     $NGINX
 10     sleep 3
 11     nmap localhost -p $PORT | grep "$PORT/tcp open"
 12     [ $? -ne 0 ] && /etc/init.d/keepalived stop
 13 fi

修改A主機的keepalived.conf如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一個沒有重複的名字即可
  5     router_id server_master
  6 }
  7 vrrp_script chk_http_port {
  8     script "/etc/keepalived/nginx_check.sh"
  9     interval 1
 10     weight -2
 11 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此處不設置爲MASTER,通過priority來競爭master
 15     state MASTER
 16 # 網卡名字
 17     interface eth0
 18 # 同一個keepalived集羣的virtual_router_id相同
 19     virtual_router_id 51
 20 # 權重,master要大於slave
 21     priority 100
 22 # 主備通訊時間間隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28     virtual_ipaddress {
 29         192.168.200.16
 30     }
 31 # 與上方nginx運行狀況檢測呼應
 32     track_script {
 33         chk_http_port
 34     }   
 35 }  

在B主機的keepalived.conf中添加同樣的內容,以及生成同樣的檢測腳本,可以通過scp命令直接將A主機上的檢測腳本文件發送給B主機,命令如下

scp nginx_check.sh root@A主機ip:/etc/keepalived/nginx_check.sh

重啓keepalived,發現A B兩臺主機都綁定上了虛擬IP
在這裏插入圖片描述在這裏插入圖片描述
先在瀏覽器上做準備環境中所說的同樣的測試,如果結果同準備環境中的結果,說明配置大概沒問題。現在,停止A主機上的Nginx,讓後去瀏覽器上通過A主機的IP訪問loadBalanceTest.html頁面,可以達到同樣的效果,說明配置成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章