Keepalived+Nginx+Tomcat配置高可用負載均衡系統示例

前言

此示例爲keepalived+nginx+tomcat的基礎配置示例,某些特定配置此例中不會出現,在示例中會用到三個虛擬機:兩個純命令行用於模擬服務端配置,一個帶桌面環境的用於模擬客戶端訪問,這樣三臺虛擬機使用NAT模式鏈接的時候是在同一個虛擬網絡中,更符合服務器的實際使用場景,虛擬機軟件爲VMPlayer,這個對於我的能夠無償使用,用起來來不錯,推薦一下。html

本實例中是模擬使用場景,機器性能有限,全部nginx和Tomcat就放到一個機器上了,實際場景中若是能夠儘可能分開,防止nginx所在服務器出問題時跟着當掉一個或多個Tomcatjava

建立虛擬機

此部分是爲了照顧對於虛擬機安裝不熟悉的同窗,若是已經熟悉了虛擬機的安裝或有實體機環境等,能夠跳過此步驟linux

  1. 建立服務器虛擬機(mini安裝)
    • 打開VMPlayer,而後界面以下,點擊建立新虛擬機nginx

    • 彈出頁面後選擇最後一項,稍後安裝操做系統,這裏必定要選擇這個,由於若是選擇其餘直接安裝的話會使用簡易安裝,默認安裝完是帶桌面的c++

    • 下一步,而後選擇Centos 64位的操做系統,這個須要針對鏡像來選擇,我這裏選這個是由於我有現成的64位鏡像web

    • 下一步,這裏設置下虛擬機的名字和安裝地址,便於區分apache

    • 下一步,而後須要設置硬盤,大小隨意(虛擬機建立以後硬盤大小隻能增大不能減少了,因此這裏能夠設置的小一點,親測配置完成後也就才2G,這裏設置5G應該就足夠了),下邊兩項也是二選一隨意瀏覽器

    • 下一步,界面以下,這裏咱們須要點擊「自定義硬件」來配置系統的光驅,若是實體機的配置低的話能夠在這裏下降下虛擬機的CPU和內存等,命令行模式下的CentOS並不須要多高的配置(單核512M能夠無壓力運行)tomcat

    • 在打開的界面中選擇光驅,而後選擇使用ISO鏡像,點擊瀏覽選擇鏡像便可,這個鏡像能夠從CentOS官網下載安全

    • 以後點擊關閉,再點擊完成便可,此時的界面以下:

    • 此時虛擬機的硬件已經準備完畢,接下來咱們點擊播放虛擬機配置系統,點擊後界面以下,選擇第一項Install

    • 接下來稍等片刻會進入圖形化界面,這裏不用擔憂,這個只是安裝的圖形界面,與以後系統不要緊,以下:

    • 由於是要最小化安裝,因此語言默認英文便可,點擊Continue,跳轉後的界面爲配置界面,咱們僅須要修改下圖中紅框的部分,其餘的默認便可。

    • 第一項是配置系統的硬盤,這裏咱們不須要進行任何配置,點擊進入以後直接點擊左上角的Done按鈕便可
    • 第二項是配置系統的網絡,默認不鏈接,因此咱們須要點擊進入配置頁面,而後將右上角的OFF置成ON,而後點擊DONE,以後會跳轉回一開始的設置頁,咱們就能夠開始系統的安裝了,點擊Begin Installation,接下來須要設置用戶

    • ROOT用戶的密碼是必需要建立的,其餘用戶能夠根據須要進行建立,這裏我只設置了ROOT用戶的密碼,方便後續的操做,不用考慮權限問題,實際應用中是要用其餘用戶操做的,後續的操做可視狀況賦予權限便可。還有須要注意的是若是用戶的密碼強度很低,須要點擊兩次DONE來肯定。

    • 接下來就是等待結束重啓便可,至此CentOS就安裝完成了

  2. 建立客戶端虛擬機(簡易安裝安裝)
    在這個實例中客戶端有兩個用處,一是經過瀏覽器測試服務端的服務是否好用;二是經過FTP向服務端上傳幾個源碼包。其實上傳源碼包這個功能大部分狀況下實體機也是能夠操做的,但實體機的瀏覽器在我測試過程當中是沒法訪問服務端的服務的,這個具體的緣由不清楚。

    客戶端虛擬機對操做系統無限制,只要能夠運行瀏覽器便可,其實命令行模式下的linux也是能夠訪問的,不過不太直觀,若是想用實體機進行訪問的話也能夠,不過須要將虛擬機的網絡鏈接模式改成橋接模式,並且對網絡有要求,須要支持DHCP才能夠。

    安裝過程和服務端的很相似,只有第二部有所區別,服務器須要選擇稍後安裝操做系統,但客戶端的虛擬機使用第二項選擇鏡像便可,以後會提示設置系統的用戶名和密碼,以後的步驟就同樣了,並且自定義硬件的時候再也不須要設置光驅。

配置基礎環境

  • 這裏以Server01爲示例,其實咱們須要配置兩臺的,我使用的用戶是root用戶,實際應用中可能須要在其餘用戶下進行,視狀況賦予權限便可。

  • 由於咱們須要向虛擬機上傳一些用到的軟件(固然可使用wget來下載,只不過有點麻煩),因此這裏咱們實體機或者客戶端使用FTP客戶端進行鏈接(工具備不少,挑選本身順手的使用,這裏推薦Xftp和FileZilla,對於我的使用都是免費的),虛擬機的IP地址能夠經過ip addr進行查看,紅框中就是當前虛擬機的IP地址

  • 接下來在FTP客戶端中輸入主機地址,須要注意的是CentOS使用的是SFTP,因此咱們輸入的地址應該是sftp://192.168.59.130,輸入帳戶密碼以後點擊快速鏈接,若是看到以下界面則表示鏈接成功了
  • 如今系統是配置完成了,不過IP是隨機分配的,若是有須要能夠將服務器的地址改成靜態IP,不過這個IP通常不會發生變化,這裏我就先不改了,可是服務器的話是必定會設置固定IP的。

    安裝JDK

  • 咱們經常使用的SUN JDK不支持yum安裝,因此須要從JDK官網下載合適的JDK,這裏我使用的是JDK-8u111-linux-x64.rpm,經過ftp上傳到/usr/local/download下(這個位置隨意),而後分別執行如下命令進行安裝,JDK的默認安裝地址爲/usr/java
cd /usr/local/download
rpm -i jdk-8u111-linux-x64.rpm
  • 安裝後便可運行java -version查看安裝的版本信息

    安裝Tomcat

  • Tomcat是能夠經過yum進行安裝的,不過示例中咱們須要兩個Tomcat,單獨下載更方便,我這裏下載的是tomcat 7.0.72。經過FTP將tomcat上傳到/usr/local/download下,而後分別運行如下命令解壓並移動到/usr/local下,由於後續要使用兩個Tomcat,因此咱們執行兩次操做
tar -xvf apache-tomcat-7.0.72.tar.gz
mv apache-tomcat-7.0.72 /usr/local/Tomcat01
tar -xvf apache-tomcat-7.0.72.tar.gz
mv apache-tomcat-7.0.72 /usr/local/Tomcat02
  • 此時咱們的Tomcat已經解壓完成了,接下來是修改端口號,防止兩個Tomcat端口衝突,Tomcat默認會佔用三個端口:8005,8080和8009,這裏咱們修改爲以下,文件爲/usr/local/Tomcat01/conf/server.xml和/usr/local/Tomcat02/conf/server.xml(這裏若是不熟悉vi編輯器的小夥伴能夠將配置文件下載到本地而後修改完成後再上傳回服務器)
Tomcat01   8015 8081 8019
Tomcat02   8025 8082 8029
  • 修改完成之後咱們進入/usr/local/Tomcat01/bin目錄下運行 ./start.sh,會提示Tomcat Started,此時實體機依然是沒法訪問的,由於防火牆沒有開放端口,執行如下命令開放端口,如下命令僅當前會話有效,增長--permanent能夠永久保留端口開放狀態,不過咱們是要作的負載均衡中nginx只會訪問本機的Tomcat,因此Tomcat的端口沒有必要一直開放,如今測試下就夠了
firewall-cmd --zone=public --add-port=8081/tcp
  • 此時咱們在客戶端虛擬機中訪問 http://192.168.59.130:8081 便可看到Tomcat的歡迎頁了,此時還有一個問題,兩個Tomcat的首頁是同樣的,負載均衡成功後沒法分辨來自哪一個Tomcat,因此咱們要加點東西區分一下,我是在每一個歡迎頁的body中增長了一行標識以下,文件位於/usr/local/Tomcat01/webapps/ROOT/index.jsp

    安裝Nginx

    nginx能夠經過修改源的方式進行yum安裝,有須要的同窗能夠自行搜索下,本例中使用源碼安裝

  • 從官網下載源碼包後經過FTP將nginx的源碼上傳到/usr/local/download下,而後執行如下命令解壓,我這裏使用的是1.10.2
tar -xvf nginx-1.10.2.tar.gz
  • 以後咱們就要用到gcc來編譯nginx的源碼了,須要先安裝gcc
yum install gcc
  • 以後分別執行如下命令,--prefix是指定軟件的安裝位置
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx
  • 執行以後咱們會的到如下錯誤,咱們須要去下載PCRE的源碼,而後經過FTP上傳到/usr/local/download下,我這裏用的是8.39
  • 解壓縮pcre的源碼,命令和之前的同樣,解壓後不須要進行其餘操做
tar -xvf pcre-8.39.tar.gz
  • 而後咱們再次編譯nginx,根據上次的提示咱們追加上pcre的源碼位置
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/download/pcre-8.39
  • 恭喜,又報錯了,此次提示換成了這個,因此咱們又須要下載zlib的源碼,老辦法上傳到老地方,而後解壓,這裏命令就不詳細說了,跟以前同樣,我下載的版本是1.2.8

  • 解壓完成後,咱們根據提示追加zlib命令,是的,就追加這兩個,不須要再追加了
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/download/pcre-8.39 --with-zlib=/usr/local/download/zlib-1.2.8
  • 編譯完成了,執行安裝,命令以下
make && make install && make clean
  • 原本覺得能夠愉快的結束了的,結果。。。。。。

  • 好吧,只能繼續安裝了
yum install gcc-c++
  • 如今執行前一步的make命令安裝就能夠了,接下來進入/usr/local/nginx/sbin目錄下執行./nginx啓動nginx,而後分別執行如下命令開放80端口(永久開放的端口在設置後必須執行reload,本次有效的不須要執行,執行reload後本次有效的端口也將失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
  • 以後咱們能夠在客戶端的瀏覽器中輸入 http://192.168.59.130 進行測試,若是出現以下頁面表示nginx啓動成功了

  • nginx是能夠作成系統服務的,實際應用中也大可能是這麼作的,不過這裏只是個示例,就不作成服務了,若是有須要的能夠自行百度,固然若是使用yum安裝的話安裝完成就已經註冊服務了

    配置負載均衡

  • 以前Tomcat咱們已經作好了配置,接下來只須要在nginx中配置便可,配置文件爲/usr/local/nginx/conf/nginx.conf,以下圖添加upstream部分,將localtion部分更改成圖中部分便可,server能夠是其餘服務器上的服務,weight越高越容易被分發請求,這裏我暫時寫本機的,另外實際使用中upstream第一行要加入ip_hash來保證同一用戶一次只能訪問同一臺服務器,解決session跨服務器丟失的問題,若是系統內使用其餘方法處理了session的共享問題就不要加了,這個實例中咱們就不加入了,由於加入了之後刷新瀏覽器頁面不會變化

  • 接下來就能夠進行負載均衡的測試了,由於修改過nginx的配置文件因此咱們須要重啓一下nginx,而後開啓兩個Tomcat,命令以下:
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
/usr/local/Tomcat01/bin/start.sh
/usr/local/Tomcat02/bin/start.sh
  • 接下來能夠在實體機的瀏覽器進行測試了,連續訪問虛擬機的nginx,這時Tomcat歡迎頁就會在01和02之間來回切換,至此負載均衡配置結束,而後你們能夠回過頭去再建立一個Server02從新配置一遍了,由於keepalived就須要根據機器分主次了,配置文件是不同的,配置完成的話server01的nginx也能夠設置將請求分發到server02的tomcat上,不過這裏爲了演示就不添加了,後續好區分請求由哪臺機器響應

    配置keepalived

  • 參考Oracle Linux的配置
  • keepalived推薦使用yum安裝,源碼安裝以後的配置挺複雜的
yum install keepalived
  • 安裝完成後須要配置keepalived的配置文件,文件位於/etc/keepalived/keepalived.conf,下圖中爲須要修改的部分,默認的配置文件中在其後還有不少內容,本實例只是簡單的DEMO,因此那些內容暫時用不上,能夠所有刪除,接下來講下圖中這部分的配置
    • state 主服務器爲MASTER,其餘服務器均爲BACKUP
    • interface 通訊用的網卡,在以前查看IP時能夠看到
    • virtual_router_id 主從服務器此ID必須一致
    • priority 優先級,主服務器必須大於其餘服務器,數值越大優先級越高
    • authentication 主從服務器必須一致
    • virtual_ipaddress 虛擬IP地址,主從服務器必須一致,此IP爲客戶端訪問時使用的IP
    • 更多詳細的配置請參考:Nginx+Keepalived實現站點高可用
    keepalivedconf
  • 配置完此文件後保存退出,而後重啓keepalived服務,此時經過ip addr查看發現主從服務器上都有192.168.59.100的虛擬IP,緣由是防火牆阻止了服務器之間的vrrp通訊,分別執行如下命令,須要針對本身電腦進行修改的只有interface後的網卡,其餘的照抄便可
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
  • 至此Keepalived的配置也完成了,經過ip addr查看可發現主服務上帶有192.168.59.100的虛擬IP而從服務器上沒有,關閉主服務器的keepalived,虛擬IP則會轉移到從服務器上來,測試服務器經過瀏覽器訪問 http://192.168.59.100 可看到虛擬IP轉移的效果,頁面會從主服務器的頁面轉換爲從服務器的頁面,這裏就不上圖片了

  • 完成上述步驟以後keepalived已經能夠實現虛擬IP轉移了,可是實際應用當中咱們須要的是自動進行虛擬IP的轉移,因此咱們還須要配置keepalived的腳本,使其可以在某一個nginx沒法提供服務的時候自動將虛擬IP轉移到備用服務器,如下腳原本自於上邊提供的連接,原理是經過curl訪問某一個連接,若是連續兩次三秒沒有響應則下降服務器的優先級,咱們在/etc/keepalived目錄下建立一個名爲check_status.sh的文件,而後鍵入如下內容
#!/bin/bash
count=0
for (( k=0; k<2; k++ ))
do
    check_code=$( curl --connect-timeout 3 -sL -w "%{http_code}\\n" http://localhost/login.html -o /dev/null )
    if [ "$check_code" != "200" ]; then
        count=$(expr $count + 1)
        sleep 3
        continue
    else
        count=0
        break
    fi
done
if [ "$count" != "0" ]; then
    exit 1
else
    exit 0
fi
  • 由於腳本後續是須要執行的,因此咱們須要賦予可執行的權限,此腳本是咱們自定義的,沒有什麼安全問題,此項操做須要在root用戶下執行,代碼以下(這裏感謝 程序人生0407 的提醒)
chmod +x check_status.sh
  • 以後咱們在keepalived.conf中配置腳本,配置內容以下
vrrp_script check_status {
    script "/etc/keepalived/check_status.sh"
    interval 5
    weight -5
}
vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.59.100
    }
    track_script {
        check_status
    }
}
  • 配置完成後重啓keepavlied便可,此時若是關閉本機的nginx的話能夠看到在5秒後虛擬IP會漂移到備用服務器上去,這裏由於演示的話圖片太多了,就不上圖片了,nginx退出能夠執行nginx -s stop命令,若是是使用yum安裝的nginx能夠經過systemctl來中止nginx服務

  • 實際使用當中常用到的還有在切換服務器時發送郵件用以提醒運維人員主服務器異常,方法有不少種,此例中就再也不贅述,有興趣的能夠自行查找相關資料

本示例到此結束,若是各位有什麼意見或建議,歡迎留言指教,轉載請註明源地址 另說明,markdown文檔中的代碼因爲未知緣由傳上來之後格式有點混亂,你們使用的時候注意下格式,不要少個括號之類的

相關文章
相關標籤/搜索