Nginx+Keepalived主從配置(雙機主從熱備)+Tomcat集羣

拓撲環境javascript

如下表格是此次測試需要的拓撲環境,幾臺server。每臺server上安裝什麼,都有介紹。css

 

server名稱 系統版本號 預裝軟件 IP地址/VIP
Nginx主server CentOS 7 最小安裝 Nginx +Keepalived 192.168.22.227/192.168.22.231
Nginx從server CentOS 7 最小安裝 Nginx +Keepalived 192.168.22.228/192.168.22.231
WebserverA CentOS 7 最小安裝 tomcat+jdk 192.168.22.229
WebserverB CentOS 7 最小安裝 tomcat+jdk 192.168.22.230

 

前置條件html

這是一個系列博客,假設有困難可以查看以前的博客。
server配置VIP:http://blog.csdn.net/u010028869/article/details/50574907
Keepalived安裝見:http://blog.csdn.net/u010028869/article/details/50527817
Keepalived原理解析:http://blog.csdn.net/u010028869/article/details/50596805
Nginx動靜分離、負載均衡:http://blog.csdn.net/u010028869/article/details/50522033
前端

 

原理圖java

 

這裏寫圖片描寫敘述

 

 

開始搭建node

1、配置VIPnginx

關於VIP(即虛擬IP)的做用,上篇博客《Keepalived原理篇》已經介紹過了。web

227和228server需要配置一樣的VIP。虛擬IP在某時刻僅僅能屬於某一個節點。還有一個節點做爲備用節點存在。當主節點不可用時。備用節點接管虛擬IP。成爲主節點(即虛擬IP漂移至從節點),提供正常服務。shell

這個VIP就像個牆頭草,兩頭跑,誰是主他就爲誰服務。瀏覽器

配置VIP的博客。上面也有連接哦。

2、安裝軟件

依照上面的表格,在對應server上安裝軟件。安裝過程再也不多說了,有問題可以點擊上面的博客連接哦。

3、配置Nginx

 server上的Nginx配置:

 

  1     user nobody;
  2 
  3     worker_processes 2;
  4 
  5     events{
  6             worker_connections 1024; 
  7     }
  8 
  9     http{
 10     #設置默認類型爲二進制流
 11             default_type    application/octet-stream;
 12 
 13             server_names_hash_bucket_size   128;
 14             #指定來自client請求頭的headerbuffer大小,設置爲32KB
 15             client_header_buffer_size   32k;
 16             #指定client請求中較大的消息頭的緩存最大數量和大小,這裏是4個32KB
 17             large_client_header_buffers 4 32k;
 18             #上傳文件大小
 19             client_max_body_size 356m;
 20             #nginx的HttpLog模塊指定。指定nginx日誌的輸出格式,輸出格式爲access
 21             log_format access '$remote_addr - $remote_user [$time_local] "$request" '
 22                     '$status $body_bytes_sent "$http_referer" '
 23                     '"$http_user_agent" "$http_x_forwarded_for"';
 24             #access日誌存在未知
 25             access_log  /usr/local/nginx/logs/access.log    access;
 26             #開啓高效模式文件傳輸模式。將tcp_nopush和tcp_nodelay兩個指另設置爲on。用於防止網絡堵塞。
 27             sendfile    on;
 28             tcp_nopush  on;
 29             tcp_nodelay on;
 30             #設置client鏈接保持活動的超時時間
 31             keepalive_timeout   65;
 32             server_tokens   off;
 33             #client請求主體讀取緩存
 34             client_body_buffer_size 512k;
 35             proxy_connect_timeout   5;
 36             proxy_send_timeout      60;
 37             proxy_read_timeout      5;
 38             proxy_buffer_size       16k;
 39             proxy_buffers           4 64k;
 40             proxy_busy_buffers_size 128k;
 41             proxy_temp_file_write_size 128k;
 42 
 43             #fastcgi_connect_timeout 300;
 44             #fastcgi_send_timeout   300;
 45             #fastcgi_read_timeout   300;
 46             #fastcgi_buffer_timeout 300;
 47             #fastcgi_buffers 4 64k;
 48             #fastcgi_busy_buffers_size 128k;
 49             #fastcgi_temp_file_write_size 128k;
 50 
 51             #開啓gzip
 52             gzip    on;
 53             #贊成壓縮的最小字節數
 54             gzip_min_length 1k;
 55             #4個單位爲16k的內存做爲壓縮結果流緩存
 56             gzip_buffers 4 16k;
 57             #設置識別HTTP協議版本號。默認是1.1
 58             gzip_http_version 1.1;
 59             #gzip壓縮比,可在1~9中設置。1壓縮比最小。速度最快。9壓縮比最大,速度最慢,消耗CPU
 60             gzip_comp_level 2;
 61             #壓縮的類型
 62             gzip_types text/plain application/x-javascript text/css application/xml;
 63             #讓前端的緩存server混村通過的gzip壓縮的頁面
 64             gzip_vary   on;
 65 
 66             upstream mycluster{
 67                      server 192.168.22.229:8080 weight=1;
 68                      server 192.168.22.230:8080 weight=1;
 69                     }
 70 
 71             server{
 72                     listen 8088;
 73                     server_name 192.168.22.228;
 74                     charset    utf-8; #設置編碼爲utf-8
 75                     #root   html;
 76 
 77             #location / {
 78             #    root   html;
 79             #    index  index.html index.htm;
 80             #}
 81 
 82             #location ~ .*\.(jsp|do|action)$
 83             location / {
 84                     proxy_next_upstream http_502 http_504 error timeout invalid_header;
 85                     proxy_pass http://mycluster;
 86                     # 真實的clientIP
 87                     proxy_set_header   X-Real-IP        $remote_addr; 
 88                     # 請求頭中Host信息
 89                     proxy_set_header   Host             $host; 
 90                     # 代理路由信息,此處取IP有安全隱患
 91                     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 92                     # 真實的用戶訪問協議
 93                     proxy_set_header   X-Forwarded-Proto $scheme;
 94             }
 95             #靜態文件交給nginx處理
 96             location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
 97             {
 98                     root /usr/local/webapps;
 99                     expires 30d;
100             }
101             #靜態文件交給nginx處理
102             location ~ .*\.(js|css)?
103  
104 
105  
106 
107  
108 
109 $ { root /usr/local/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

 

 

 

另外還需要在227,228server上新建一個文件夾/usr/local/webapps/drp/img,在img文件夾中存放圖片girl.jpg。

假設Nginxserver較多的話。可以使用Rsync作服務端本身主動同步或者使用NFS、MFS分佈式共享存儲,避免一個個複製文件。

還有。這塊Nginx配置是作過一些優化的,比方開啓gzip壓縮,開啓高效文件傳輸模式。設置緩存,動靜分離,負載均衡等,可以直接拿到項目中使用。

4、配置Keepalived

server上的Keepalived配置:

! 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 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } #配置Nginx健康監測腳本 vrrp_script check_nginx { script "</dev/tcp/127.0.0.1/8088" interval 3 weight -2 } vrrp_instance VI_1 { state MASTER #網卡名稱 interface eno16777736 virtual_router_id 151 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } virtual_ipaddress { 192.168.22.231 } }

228server上的Keepalived配置:

! 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 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script check_nginx { #script "/opt/chknginx.sh" script "</dev/tcp/127.0.0.1/8088" interval 3 weight -2 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 151 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } virtual_ipaddress { 192.168.22.231 } }

 

特別注意,Nginx健康監測腳本。

在本地寫一個shell腳本,Keepalived監測不到。不知道爲何,網上的博客都是這麼寫的。但是在我這裏就不行。最後直接在Keepalived配置文件的script標籤中寫了這段監測的腳本。才得以成功。

vrrp_script chk_http_port { script "</dev/tcp/192.168.22.227/80" interval 1 weight -10 }

另外,假設你不明確某些配置的意思。可以查看上篇博客,裏面針對每條配置文件都作了具體解析。

 

5、Tomcat配置

server,加入默認頁

在Tomcat的webapps文件夾下新建文件夾drp,並且建立index.jsp頁面

<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <HTML> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Nginx+Keepalived高可用,負載均衡。動靜分離測試</title> </head> <body> <h1>您正在訪問server:192.168.22.229</h1> <img src="/drp/img/girl.jpg" alt="女孩" /> </body> </html>

230server同上

 

6、啓動服務並測試

分別啓動各個server上的Nginx、Keepalived、Tomcat,並測試是否能正常訪問。

 

①啓動測試Tomcat

 

這裏寫圖片描寫敘述

 

 

這裏寫圖片描寫敘述

 

可以看到229和230server上的Tomcat已經可以正常訪問。圖片沒有載入出來,是因爲圖片沒有在Tomcatserver上存儲,而放在了Nginx上。

②啓動測試Nginx

 

這裏寫圖片描寫敘述

 

可以看到227和228上的Nginx啓動成功。並且實現了負載均衡和動靜分離的效果,圖片被成功的載入了出來。

③ 保證所有服務都可正常訪問後,啓動Keepalived測試。

啓動227。228server上的Keepalived。在瀏覽器中輸入地址:http://192.168.22.231:8088/drp/index.jsp

這裏寫圖片描寫敘述

 

192.168.22.231是我們設置的虛擬ip,在訪問站點的時候不在經過Nginx的ip了。而要經過這個vip進行訪問。

Keepalived啓動後我們可以經過查看/var/log 下的messages文件(日誌文件),查看主從狀態。
查看227server/var/log/messages:

這裏寫圖片描寫敘述

 

可以看到227爲Masterserver。那麼我們現在經過192.168.22.231訪問的就是227上的Nginx。

 

 

Nginx高可用測試

現在我們經過兩個方面來測試高可用:

① server層的雙機熱備。模擬方式爲關閉server。或者關閉Keepalived。

a. 關閉227Keepalived進程

現在提供服務的是227server,使用命令service keepalived stop將227上的Keepalived進程關閉掉以後。

查看227servermessas日誌:

這裏寫圖片描寫敘述

 

將192.168.22.231這個虛擬ip移除,關閉Keepalived。

 

查看228servermessages日誌:

這裏寫圖片描寫敘述

 

228原來爲從server。當227server宕機後,228server由從server升級爲主server,並且綁定上192.168.22.231這個虛擬IP,以繼續提供服務。站點可以繼續訪問。



b. 啓動227Keepalived

查看227servermessas日誌:

這裏寫圖片描寫敘述

 

Keepalived成功啓動後。227server繼續接管192.168.22.231,成爲MASTERserver,繼續提供服務。

查看228servermessages日誌:

這裏寫圖片描寫敘述

 

對應的228server。轉變爲BACKUPserver,並且移除VIP。

 

② 應用層的雙機熱備。模擬方式爲Kill掉Nginx進程

a. 關閉227Nginx

查看227servermessages日誌:

這裏寫圖片描寫敘述

 

VRRP_Script(check_nginx) failed ,意思是健康監測腳本運行失敗,代表Nginx服務壞掉,或者沒有啓動。而後Keepalived會使227server轉變爲BACKUP狀態,移除VIP。

 

查看228servermessages日誌:

這裏寫圖片描寫敘述

 

固然不出所料,228server已經變爲MASTER狀態。從而繼續提供服務。

 

b. 又一次啓動227Nginx

查看227servermessages日誌:

這裏寫圖片描寫敘述

 

VRRP_Script(check_nginx) succeeded 。意思是健康監測腳本運行成功。Nginx正常運行。

而後227server就會轉變爲MASTER狀態。並提供服務。

查看228servermessages日誌:

這裏寫圖片描寫敘述

 

228server已經變爲BUCKUP狀態。

 

 

小結


至此,高可用的一系列測試就已經完畢了。在整個測試過程當中,不論是關閉某臺server的Nginx。Keepalived仍是整個server宕機。站點一直沒有中斷提供服務,這已經達到了主要的高可用;但是還有個缺陷就是假設Nginx主server不出問題的話,那麼備用server將長期處於備份狀態。這種巨大資源浪費是不能容忍的。

固然這也有對應的方案來解決:Nginx雙主集羣+DNS輪詢。敬請期待。。

 

這就是一個架構不斷演變。進化的過程。

相關文章
相關標籤/搜索