伺服器群集—Nginx+Tomcat+keepalived負載均衡、動靜分離群集

康丶發表於2020-12-14

一、架構解析

1.1 Tomcat

1.11 Tomcat簡介

最初是由Sun的軟體架構師詹姆斯.鄧肯。戴維森開發
安裝Tomcat後,安裝路徑下面的目錄和檔案,是使用或者配置Tomcat的重要檔案

1.12 Tomcat重要目錄

bin:存放啟動和關閉Tomcat指令碼
conf:存放Tomcat不同的配置檔案
doc:存放Tomcat文件
lib:存放Tomcat執行需要的庫檔案
logs:存放Tomcat執行時的LOG檔案
src:存放Tomcat的原始碼
webapps:Tomcat的主要Web釋出目錄
work:存放jsp編譯後產生的class檔案

1.2 Nginx

1.21 Nginx應用

Nginx是一款非常優秀的HTTP伺服器軟體
● 支援高達50000個併發連線數的響應
● 擁有強大的靜態資源處理能力
● 執行穩定
● 記憶體,CPU等系統資源消耗非常低
目前很多大型網站都應用Nginx伺服器作為後端網站程式的反向代理及負載均衡器,提升整個站點的負載併發能力

1.22 Nginx負載均衡實現原理——反向代理

Nginx實現負載均衡是通過反向代理實現
反向代理原理
在這裡插入圖片描述

1.23 Nginy配置反向代理的主要引數

● upstream 服務池名 { }
配置後端伺服器池,以提供響應資料
● proxy_pass http://服務池名
配置將訪問請求轉發給後端伺服器池的伺服器處理

2.3 動靜分離原理

服務端接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源由Nginx提供服務,動態資源Nginx轉發至後端(Tomcat等)

2.31 Nginx靜態處理優勢

● Nginx處理靜態頁面的效率遠高於Tomcat的處理能力
● 若Tomcat的請求量為1000次,則Nginx的請求量為6000次
● Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M
● Nginx處理靜態資源的能力是Tomcat處理的6倍

二、Nginx+Tomcat+keepalived負載均衡,動靜分離,熱備群集

以Nginx作為負載均衡器,Tomcat作為應用伺服器,增加熱備功能

2.1 部署解析

2.11 Tomcat部署與測試網站搭建

要求部署兩臺後端Tomcat伺服器
為了進行測試,搭建兩個內容不同的網站
Tomcat部署與網站搭建步驟

  • 關閉firewalld防火牆

  • 安裝JDK,配置JAVA環境

  • 安裝配置Tomcat

  • 建立/web/webapp1目錄,修改server.xml,將網站檔案目錄更改到/web/webapp1/路徑下

  • /web/webapp1/下建立測試頁面index.jsp,並進行測試

2.12 Nginx配置負載均衡,動靜分離,熱備

在Nginx伺服器上安裝Nginx,反向代理兩個Tomcat站點,並實現負載均衡

  • 關閉Firewalld防火牆

  • 安裝Nginx依賴軟體包

  • 解壓並編譯安裝Nginx

  • 配置nginx.conf,新增location靜態頁面處理及新增upstream配置段與proxy_pass

  • 檢測配置檔案與啟動Nginx

  • 測試負載均衡,動靜分離效果

  • 安裝keepalived依賴包

  • 解壓並編譯安裝keepalived

  • 編輯keepalived.conf

  • 測試熱備

2.2 部署流程

2.21 配置環境

記得改名及所有伺服器關閉防火牆

nginx120.0.0.11(排程器1)
nginx220.0.0.12(排程器2)
tomcat120.0.0.13(節點伺服器1)
tomcat220.0.0.14(節點伺服器2)
nfs20.0.0.15(儲存伺服器)
client20.0.0.16(客戶機)

2.22 nfs配置

1.建立測試頁面web1,並新增圖片a.jpg b.jpg

[root@nfs ~]# mkdir /web1
[root@nfs ~]# mkdir /web2
[root@nfs ~]# vi /web1/index.jsp    #建立動態主頁
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat1</title>
</head>
<body>
<% out.println("this is tomcat1 server");%>
<div>動態頁面</div><br/><img src="a.jpg" />
</body>
</html>

# %%:表示區間
# language表示語言是java
# import類似於java類中的import就是把包匯入進來,這樣在jsp才可以呼叫包中的類
# pageEncoding表示頁面的編碼格式

[root@nfs ~]# cp /web1/index.jsp /web2    #複製主頁檔案到web2

2.修改測試頁面web2

[root@nfs ~]# vi /web2/index.jsp   #修改
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020121402181835.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thbmdfMDE=,size_16,color_FFFFFF,t_70)

3.新增圖片a.jpg b.jpg

[root@nfs ~]# cd /web1
[root@nfs ~]# cd /web2

在這裡插入圖片描述
在這裡插入圖片描述

4.配置檔案

[root@nfs ~]# vi /etc/exports        #新增
/web1 20.0.0.12 (ro)          #ro:只讀
/web2 20.0.0.13 (ro)
[root@nfs ~]# systemctl start nfs     #服務開啟(允許nginx客戶可以訪問共享)
[root@nfs ~]# systemctl restart rpcbind            #(跨平臺,埠管理服務)
[root@nfs ~]# showmount -e      #檢視共享情況

在這裡插入圖片描述
在這裡插入圖片描述

2.23 tomcat配置

在tomcat1(we1)、tomcat2(web2)上新增安裝包
apache-tomcat-8.5.16.tar.gz
jdk-8u91-linux-x64.tar.gz

tomcat1(we1)上配置

1.tar解包

[root@tomcat1 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz 
[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java    #解壓縮軟體包到/usr/local/下生成java目錄

2.設定環境變數

[root@tomcat1 ~]# vi /etc/profile     #末行新增
export JAVA_HOME=/usr/local/java    #定義變數並設為全域性變數,設定JAVA的根目錄
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre     #引用環境變數
[root@tomcat1 ~]# source /etc/profile     #變數立即生效
[root@tomcat1 ~]# echo $PATH       #檢視當前環境變數
[root@tomcat1 ~]# java -version     #檢視版本

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

3.編譯java指令碼,測試java是否正常執行

[root@tomcat1 ~]# vi abc.java
public class abc {

        public static void main (String[] args) {
               System.out.println ("hello world!!!");
}
}
[root@tomcat1 ~]# javac abc.java    #編譯
[root@tomcat1 ~]# java abc    #執行
hello world!!!           #代表正常執行

4.安裝Tomcat

4.1 解壓縮
[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz 
[root@tomcat1 ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8     #生成tomcat8目錄

4.2 建立站點目錄並掛載
[root@tomcat1 ~]# mkdir /webapp1
[root@tomcat1 ~]# cd /webapp1/ 
[root@tomcat1 webapp1]# mount 20.0.0.15:/web1 /webapp1/         #/webapp1掛載到nfs/web1下
[root@tomcat1 webapp1]# df -Th
[root@tomcat1 webapp1]# cd

4.3 配置檔案中引用站點主頁目錄
[root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml   #配置檔案中引用目錄
#新增:
      <Context docBase="/webapp1" path="" reloadable="false">
      </Context>

#docBase:web應用的文件基準目錄
#path=""指定訪問路徑URI(虛擬目錄名),訪問url路徑下是否跟內容
#reloadable:本項為true時,當web.xml或者class有改動的時候都會自動重新載入不需要從新啟動服務(所謂的支援熱釋出功能)

#其中 <Host name=“localhost” appBase=“webapps”
#localhost:指的是本地主機名,不是域名,代表地址(127.0.0.14.4 啟動關閉指令碼建立連結並啟動
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup   #啟動指令碼建立連結
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown   #關閉指令碼建立連結
[root@tomcat1 ~]# tomcatup  #服務啟動
[root@tomcat1 ~]# netstat -anpt | grep 8080  #檢視8080埠狀態(tomcat預設埠) 

在這裡插入圖片描述
在這裡插入圖片描述

5. 瀏覽器驗證
http://20.0.0.13:8080

在這裡插入圖片描述

以上完成tomcat1的配置

tomcat2(we2)配置同上
修改:建立站點webapp2掛載到web2下,配置檔案內引用目錄也需修改為webapp2;
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

瀏覽器驗證http://20.0.0.14:8080
在這裡插入圖片描述

以上完成tomcat2的配置

2.24 排程器配置

在nginx1,nginx2上
新增nginx,keepalived安裝包
nginx-1.13.7.tar
keepalived-2.0.13.tar.gz

2.241 配置Nginx

nginx1上配置

1. 安裝Nginx依賴包

[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel    #pcre-devel:正規表示式庫;zlib-devel:函式庫
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx  #建立不帶宿主,不可登入的使用者nginx
[root@nginx1 ~]# tar zxvf nginx-1.13.7.tar.gz       #解壓縮
[root@nginx1 ~]# cd nginx-1.13.7/    #進入主目錄
[root@nginx1 nginx-1.13.7]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx   #安裝路徑,屬主,屬組設定
[root@nginx1 nginx-1.13.7]# make && make install   #編譯安裝
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/conf/nginx.conf /etc/     #建立設定連結
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/      #建立命令連結,方便使用命令
[root@nginx1 nginx-1.13.7]# cd

2. 配置檔案

[root@nginx1 ~]# vi /usr/local/nginx/conf/nginx.conf
#server上面新增upstream服務池:server裡面新增呼叫程式
    upstream tomcat_server {        #服務地址池名
             server 20.0.0.13:8080 weight=1;
             server 20.0.0.14:8080 weight=1;
             #節點      ip地址  埠號  權重
}

        location ~ \.jsp$ {
             proxy_pass http://tomcat_server;  
}                                         #服務地址池名

[root@nginx1 ~]# nginx -t   檢查語法
[root@nginx1 ~]# nginx    服務啟動
[root@nginx1 ~]# netstat -anpt | grep 80   檢視埠狀態

在這裡插入圖片描述
在這裡插入圖片描述

3. 在瀏覽器上測試該排程器是否可以單獨工作
http://20.0.0.11
在這裡插入圖片描述

4.解決靜態資源在nginx上顯示問題
http://20.0.0.11/index.jsp
發現圖片未顯示出來
在這裡插入圖片描述

進行抓包檢視
發現圖片a.jpg和圖片b.jpg轉跳地址都是20.0.0.11(nginx地址),而不是20.0.0.13,20.0.0.14(tomcat地址)說明了靜態資源是在nginx上進行排程的
在這裡插入圖片描述

解決圖片不顯示問題
在本地/usr/local/nginx/html/目錄下新增圖片a.jpg b.jpg
就可以解決了
在這裡插入圖片描述
在這裡插入圖片描述

瀏覽器再次訪問http://20.0.0.11/index.jsp

在這裡插入圖片描述
在這裡插入圖片描述

進行抓包檢視:
在這裡插入圖片描述

以上說明圖片,音訊等靜態資源應該放在nginx的站點目錄下

nginx2上配置同上

2.242 配置keepalived

1. 安裝包

[root@nginx1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel   #安裝依賴包
[root@nginx1 ~]# tar zxvf keepalived-2.0.13.tar.gz    #解壓縮
[root@nginx1 ~]# cd keepalived-2.0.13/   
[root@nginx1 keepalived-2.0.13]# ./configure --prefix=/      路徑設定
[root@nginx1 keepalived-2.0.13]# make && make install   編譯安裝
[root@nginx1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d
[root@nginx1 keepalived-2.0.13]# vi /etc/init.d/keepalived   
修改:
#chkconfig: 35 21 79  執行級別
[root@nginx1 keepalived-2.0.13]# chmod 755 /etc/init.d
[root@nginx1 keepalived-2.0.13]# chkconfig --add keepalived
[root@nginx1 keepalived-2.0.13]# chkconfig --list

在這裡插入圖片描述

2. 新增配置檔案

[root@nginx1 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 
刪除所有,除了第一行
新增:
global_defs {
     router_id nginx1       #本伺服器的名稱
}
vrrp_script chk_http_port {       #vrrp指令碼
     script "/usr/local/src/nginx.sh"    #指令碼路徑 最後手動執行此指令碼,以確保指令碼能夠正常執行
     interval 2          #檢測間隔時間 單位秒
     weight 2
}**加粗樣式**
vrrp_instance vi_1 {       #例項名稱
     state MASTER        #指定keepalived的角色,MASTER為主,BACKUP為備
     interface ens33    #當前進行vrrp通訊的網路介面卡
     virtual_router_id 51   #虛擬路由編號,主從要一致
     priority 110            #優先順序,數值越大,獲取地址優先順序越大
     adver_int 1             #檢查間隔,預設為1s (vrrp組播週期秒數)
     authentication {       #認證方式
          auth_type PASS
          auth_pass 1111
}
track_script {         
       chk_http_port     #呼叫檢測指令碼  
}
virtual_ipaddress {
     20.0.0.100           #定義虛擬ip(VIP}
}

在排程器2上完成keepalived的編譯安裝後從排程器1進行拷貝
排程器1[root@nginx1 keepalived-2.0.13]# scp /etc/keepalived/keepalived.conf root@20.0.0.12:/etc/keepalived/     #拷貝檔案
排程器2上進行檔案編輯
[root@nginx2 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 
修改:
router_id nginx2   伺服器名稱
 state BACKUP      指定keepalived的角色,MASTER為主,BACKUP為備
 priority 105   優先順序

在這裡插入圖片描述

3. 配置指令碼檔案
在排程器1上配置指令碼檔案,並拷貝給排程器2

[root@nginx1 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`    查詢程式數
if [ $A -eq 0 ]          
then /usr/local/nginx/sbin/nginx
   if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
    then exit 1
    else exit 0
   fi
else
   exit 0
fi
[root@nginx1 keepalived-2.0.13]# scp /usr/local/src/nginx.sh root@20.0.0.12:/usr/local/src
[root@nginx1 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh 
[root@nginx1 keepalived-2.0.13]# systemctl start keepalived.service 
[root@nginx1 keepalived-2.0.13]# systemctl status keepalived.service 服務狀態
[root@nginx1 ~]# tail -100 /var/log/messages    檢視日誌
[root@nginx1 ~]# ip addr   檢視虛擬地址

在這裡插入圖片描述
在這裡插入圖片描述

排程器2上

[root@nginx2 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh 
[root@nginx2 keepalived-2.0.13]# systemctl start keepalived.service 
[root@nginx2 keepalived-2.0.13]# systemctl status keepalived.service 服務狀態
[root@nginx2 ~]# tail -100 /var/log/messages    檢視日誌
[root@nginx2 ~]# ip addr   檢視虛擬地址

在這裡插入圖片描述
在這裡插入圖片描述

4. 瀏覽器訪問
http://20.0.0.100
http://20.0.0.100/index.jsp
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

2.25 故障模擬

2.251 排程器1出現問題時,是否高可用

排程器1[root@nginx1 ~]# systemctl stop keepalived.service    #停止服務
[root@nginx1 ~]# ip addr  #虛擬地址消失
排程器2[root@nginx2 ~]# ip addr    #漂移地址過來

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

網頁仍然能夠訪問

2.251 節點1出現問題,訪問是否影響

排程器1[root@nginx1 ~]# tomcatdown     #tomcat停止服務

在這裡插入圖片描述

在瀏覽器上訪問發現只能訪問tomcat2的頁面

相關文章