Nginx實現(xiàn)服務端集群搭建
1、Nginx與Tomcat部署
我們知道Nginx在高并發(fā)場景和處理靜態(tài)資源是非常高性能的,但是在實際項目中除了靜態(tài)資源還有就是后臺業(yè)務代碼模塊,一般后臺業(yè)務代碼模塊都會被部署在Tomcat,weblogic或者是websphere等web服務器上,那么如何使用Nginx接收用戶的請求并把請求轉發(fā)到后臺web服務器?

步驟分析:
- 準備Tomcat環(huán)境,并在Tomcat上部署一個web項目;
- 準備Nginx環(huán)境,使用Nginx接收請求,并把請求分發(fā)到Tomcat上。
upstream webservice {
server localhost:8080;
}
server {
listen 80;
server_name localhost;
location /demo {
proxy_pass http://webservice;
}
}2、動靜分離
什么是動靜分離?
- 動:后臺應用程序的業(yè)務處理。
- 靜:網(wǎng)站的靜態(tài)資源(html,javaScript,css,images等文件)。
- 分離:將兩者分開部署訪問,提供用戶進行訪問。舉例說明就是以后所有和靜態(tài)資源相關的內容都交給Nginx來部署訪問,非靜態(tài)內容則交給類似于Tomcat的服務器來部署訪問。
為什么要動靜分離?
- Nginx在處理靜態(tài)資源的時候,效率是非常高的,而且Nginx的并發(fā)訪問量也是名列前茅,而Tomcat則相對比較弱一些,所以把靜態(tài)資源交給Nginx后,可以減輕Tomcat服務器的訪問壓力并提高靜態(tài)資源的訪問速度。
- 動靜分離以后,降低了動態(tài)資源和靜態(tài)資源的耦合度。如動態(tài)資源宕機了也不影響靜態(tài)資源的展示。
如何實現(xiàn)動靜分離?
- 實現(xiàn)動靜分離的方式有很多,比如靜態(tài)資源部署到CDN、Nginx等服務器上,動態(tài)資源可以部署到Tomcat,weblogic或者websphere上。
3、Nginx動靜分離實現(xiàn)步驟
1、將demo.war項目中的靜態(tài)資源都刪除掉,重新打包生成一個war包;
2、將war包部署到tomcat中,把之前部署的內容刪除掉;
進入到tomcat的webapp目錄下,將之前的內容刪除掉;
將新的war包復制到webapps下;
將tomcat啟動。
3、在Nginx所在服務器創(chuàng)建如下目錄,并將對應的靜態(tài)資源放入指定的位置;
web/
images/
logo.png
mv.png
index.html
js/
jquery.min.js其中index.html頁面的內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
$(function () {
$.get("http://192.168.200.133/demo/getAddress", function (date) {
$("#msg").html(date);
});
});
</script>
</head>
<body>
<img src="images/logo.png"/>
<h1>Nginx如何將請求轉發(fā)到后端服務器</h1>
<h3 id="msg"></h3>
<img src="images/mv.png"/>
</body>
</html>4、配置Nginx的靜態(tài)資源與動態(tài)資源的訪問;
upstream webservice {
server localhost:8080;
}
server {
listen 80;
server_name localhost;
# 動態(tài)資源訪問。以/demo開頭的為動態(tài)資源
location /demo {
proxy_pass http://webservice;
}
# 靜態(tài)資源的訪問配置。以.png .jpg .gif .js 結尾的靜態(tài)資源訪問
location ~/.*\.(png|jpg|gif|js) {
# 根目錄在Nginx的html/web目錄下
root html/web;
}
# 首頁在Nginx的html/web目錄下的index.html
location / {
root html/web;
index index.html index.htm;
}
# 配置錯誤頁面
error_page 500 502 503 504 /50x.html;
location =/50x.html {
root html;
}
}5、啟動測試,訪問 http://localhost/index.html 。
假如某個時間點,由于某個原因導致Tomcat后端服務器宕機了,我們再次訪問Nginx,會得到如下效果,用戶還是能看到頁面,只是缺失了訪問次數(shù)的統(tǒng)計,這就是前后端耦合度降低的效果,并且整個請求只和后端服務器交互了一次,js和images都直接從Nginx返回,提供了效率,降低了后端的服務器的壓力。
4、Nginx實現(xiàn)Tomcat集群搭建
在使用Nginx和Tomcat部署項目的時候,我們使用的是一臺Nginx服務器和一臺Tomcat服務器,效果圖如下:

那么問題來了,如果Tomcat真的宕機了,整個系統(tǒng)就不會完整,所以如何解決上述問題,一臺服務器宕機,那就多搭建幾臺Tomcat服務器,這樣的話就提升了后端服務器的可用性。這也就是我們常說的集群,搭建Tomcat的集群需要用到Nginx的反向代理和負載均衡的知識,具體如何實現(xiàn)呢?

環(huán)境準備:
- 準備3臺Tomcat,使用端口進行區(qū)分(實際環(huán)境應該是三臺服務器),修改server.xml,將端口分別修改為8080、8180、8280;
- 啟動Tomcat并訪問測試;
5、Nginx高可用解決方案
針對于上面提到的問題,我們來分析下想要解決上述問題,需要面臨哪些問題?

需要兩臺以上的Nginx服務器對外提供服務,這樣的話假如其中一臺宕機了,另外一臺還能對外提供服務,但是如果是兩臺Nginx服務器的話,會有兩個IP地址,用戶該訪問哪臺服務器,用戶怎么知道哪臺是好的,哪臺是宕機了呢?
5.1、Keepalived
使用Keepalived來解決,Keepalived軟件是由C編寫的,最初是專為LVS負載均衡軟件設計的,Keepalived軟件主要是通過VRRP協(xié)議實現(xiàn)高可用功能。

5.2、VRRP協(xié)議
VRRP(Virtual Route Redundancy Protocol)協(xié)議,翻譯過來為虛擬路由冗余協(xié)議。VRRP協(xié)議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP,而在路由器組內部,如果實際擁有這個對外IP的路由器如果工作正常的話就是MASTER,MASTER實現(xiàn)針對虛擬路由器IP的各種網(wǎng)絡功能。其他設備不擁有該虛擬IP,狀態(tài)為BACKUP,除了接收MASTER的VRRP狀態(tài)通告信息以外,不執(zhí)行對外的網(wǎng)絡功能。當主機失效時,BACKUP將接管原先MASTER的網(wǎng)絡功能。
從上面的介紹信息獲取到的內容就是VRRP是一種協(xié)議,那這個協(xié)議是用來干什么的?
- 選擇協(xié)議:VRRP可以把一個虛擬路由器的責任動態(tài)分配到局域網(wǎng)上的VRRP路由器中的一臺。其中的虛擬路由即Virtual路由群組創(chuàng)建的一個不真實存在的路由,這個虛擬路由也是有對應的IP地址。而且VRRP路由1和VRRP路由2之間會有競爭選擇,通過選擇會產生一個Master路由和一個Backup路由。
- 路由容錯協(xié)議:Master路由和Backup路由之間會有一個心跳檢測,Master會定時告知Backup自己的狀態(tài),如果在指定時間內,Backup沒有接收到這個通知內容,Backup就會替代Master成為新的Master。Master路由有一個特權就是虛擬路由和后端服務器都是通過Master進行數(shù)據(jù)傳遞交互的,而備份結點則會直接丟棄這些請求和資源,不做處理,只是去監(jiān)聽Master的狀態(tài)。
用了Keepalived后,解決方案如下:

5.3、環(huán)境搭建
環(huán)境準備:
| VIP | IP | 主機名 | 主/從 |
|---|---|---|---|
| 192.168.200.133 | keepalived1 | Master | |
| 192.168.200.222 | |||
| 192.168.200.122 | keepalived2 | Backup |
keepalived安裝:
1、從官方網(wǎng)站下載keepalived,官網(wǎng)地址https://keepalived.org/
2、將下載的資源上傳到服務器
keepalived-2.0.20.tar.gz
3、創(chuàng)建keepalived目錄,方便管理資源
mkdir keepalived
4、將壓縮文件進行解壓縮,解壓縮到指定的目錄
tar -zxf keepalived-2.0.20.tar.gz -C keepalived
5、對keepalived進行配置,編譯和安裝
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install安裝完成后,有兩個文件需要我們認識下,一個是/etc/keepalived/keepalived.conf(keepalived的系統(tǒng)配置文件,我們主要操作的就是該文件),一個是/usr/local/sbin目錄下的keepalived,是系統(tǒng)配置腳本,用來啟動和關閉keepalived。
5.4、Keepalived配置文件介紹
打開keepalived.conf配置文件。
這里面會分3部分,第一部分是global全局配置,第二部分是vrrp相關配置,第三部分是LVS相關配置。我們重點關注前兩部分。
第1臺服務器(192.168.200.133)
-global全局部分:
global_defs {
# 通知郵件,當keepalived發(fā)送切換時需要發(fā)email給具體的郵箱地址
nitification_email {
tom@abc.com
jerry@abc.com
}
# 設置發(fā)件人的郵箱信息
notification_email_from zhangsan@abc.com
# 指定smtp服務地址
smtp_server 192.168.200.1
# 指定smtp服務連接超時時間
smtp_connect_timeout 30
# 運行keepalived服務器的一個標識,可以用作發(fā)送郵件的主題信息
router_id keepalived1
# 默認是不跳過檢查,檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是
# 如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)
vrrp_skip_check_adv_addr
# 嚴格遵守VRRP協(xié)議
vrrp_strict
# 在一個接口發(fā)送的兩個免費ARP之間的延遲??梢跃_到毫秒級,默認是0
vrrp_garp_interval 0
vrrp_gna_interval 0
}
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.200.222
}
}第2臺服務器(192.168.200.122)
-global全局部分:
global_defs {
# 通知郵件,當keepalived發(fā)生切換時需要發(fā)email給具體的郵箱地址
nitification_email {
tom@abc.com
jerry@abc.com
}
# 設置發(fā)件人的郵箱信息
notification_email_from zhangsan@abc.com
# 指定smtp服務地址
smtp_server 192.168.200.1
# 指定smtp服務連接超時時間
smtp_connect_timeout 30
# 運行keepalived服務器的一個標識,可以用作發(fā)送郵件的主題信息
router_id keepalived1
# 默認是不跳過檢查,檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是
# 如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)
vrrp_skip_check_adv_addr
# 嚴格遵守VRRP協(xié)議
vrrp_strict
# 在一個接口發(fā)送的兩個免費ARP之間的延遲??梢跃_到毫秒級,默認是0
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.222
}
}5.5、訪問測試
1、啟動keepalived之前,我們先使用命令 ip a,查看 192.168.200.133和192.168.200.122這兩臺服務器的IP情況。
2、分別啟動兩臺服務器的keepalived。
cd /usr/local/sbin./keepalived
再次通過 ip a 查看ip。
3、當把 192.168.200.133 服務器上的keepalived關閉后,再次查看ip。
通過上述的測試,我們發(fā)現(xiàn),虛擬IP(VIP)會在MASTER節(jié)點上,當MASTER節(jié)點上的keepalived出問題后,因為BACKUP無法收到MASTER發(fā)出的VRRP狀態(tài)通過信息,就會直接升為MASTER。VIP也會“漂移”到新的MASTER。
上面測試和Nginx有什么關系?
我們把192.168.200.133服務器的keepalived再次啟動下,由于它的優(yōu)先級高于服務器192.168.200.122的,所以它會再次成為MASTER,VIP也會“漂移”過去,然后我們再次通過瀏覽器訪問http://192.168.200.222/則會請求192.168.200.133服務器。
如果把192.168.200.133服務器的keepalived關閉掉,再次訪問相同的地址,則會騎牛192.168.200.122服務器。
效果實現(xiàn)了以后,我們會發(fā)現(xiàn)要想讓vip進行切換,就必須把服務器上的keepalived進行關閉,而什么時候關閉keepalived呢?應該是keepalived所在服務器的nginx出現(xiàn)問題后,把keepalived關閉掉,就可以讓VIP執(zhí)行另外一臺服務器,但是現(xiàn)在這所有的操作都是通過手動來完成的,我們如何能讓系統(tǒng)自動判斷當前服務器的nginx是否正確啟動,如果沒有,要能讓VIP自動“漂移”,這個問題該如何解決?
5.6、keepalived之vrrp_script
keepalived只能做到對網(wǎng)絡故障和keepalived本身的監(jiān)控,即當出現(xiàn)網(wǎng)絡故障或者keepalived本身出現(xiàn)問題時,進行切換,但是這些還不夠,我們還需要監(jiān)控keepalived所在服務器上的其他業(yè)務,比如Nginx,如果Nginx出現(xiàn)異常了,僅僅keepalived保持正常,是無法完成系統(tǒng)的正常工作的,因此需要根據(jù)業(yè)務進程的運行狀態(tài)決定是否需要進行主備切換,這個時候,我們可以通過編寫腳本對業(yè)務進程進行監(jiān)測監(jiān)控。
實現(xiàn)步驟:
在keepalived配置文件中添加對應的配置項;
vrrp_script 腳本名稱
{
script "腳本位置"
interval 3 # 執(zhí)行的時間間隔
weight -20 # 動態(tài)調整vrrp_instance的優(yōu)先級
}編寫腳本
ck_nginx.sh: #!/bin/bash num=`ps -C nginx --no-header | wc -l` if [ $num -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
Linux ps命令用于顯示當前進程(process)的狀態(tài)。-C(command):指定命令的所有進程;--no-header:排除標題。
為腳本文件設置權限
chmod 755 ck_nginx.sh
將腳本添加到
vrrp_script ck_nginx {
script "/etc/keepalived/ck_nginx.sh" # 執(zhí)行腳本的位置
interval 2 # 執(zhí)行腳本的周期,秒為單位
weight -20 # 權重的計算方式
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
...
track_script {
ck_nginx
}
}如果效果沒有出來,可以使用 tail -f /var/log/messages查看日志信息,找對應的錯誤信息。
測試
問題思考:通常如果master服務死掉后backup會變成master,但是當master服務又好了的時候master此時會搶占VIP,這樣就會發(fā)生兩次切換讀,對業(yè)務繁忙的網(wǎng)站來說是不好的。所以我們要在配置文件加入nopreempt非搶占,但是這個參數(shù)只能用于state為backup,故我們在用HA的時候最好master和backup的state都設置成backup,讓其通過priority來競爭。
到此這篇關于Nginx實現(xiàn)服務端集群搭建的文章就介紹到這了,更多相關Nginx 服務端集群搭建內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

