Nginx+Tomcat負載均衡,動靜分離群集部署解析

weixin_50345481發表於2020-12-13


前言

通過Nginx強大的靜態資源處理能力與具有後端網站程式的反向代理,動靜分離及負載均衡的能力,來解決解決Tomcat出現單點故障的問題。


一 架構解析

1.1 Tomcat

1.1.1 Tomcat簡介

最初是由Sun的軟體架構師詹姆斯.鄧肯。戴維森開發

安裝Tomcat後,安裝路徑下面的目錄和檔案,是使用或者配置Tomcat的重要檔案

1.1.2 Tomcat重要目錄

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

1.2 Nginx

1.2.1 Nginx應用

Nginx是一款非常優秀的HTTP伺服器軟體

支援高達50000個併發連線數的響應
擁有強大的靜態資源處理能力
執行穩定
記憶體,CPU等系統資源消耗非常低

目前很多大型網站都應用Nginx伺服器作為後端網站程式的反向代理及負載均衡器,提升整個站點的負載併發能力

1.2.2 Nginx負載均衡實現原理

1.2.2.1 Nginx實現負載均衡是通過反向代理實現

反向代理原理

在這裡插入圖片描述

1.2.2.2 Nginx配置反向代理的主要引數

upstream 服務池名{}

配置後端伺服器池,以提供響應資料

proxy_pass http://伺服器池名

配置將訪問請求轉發給後端伺服器池的伺服器處理

1.2.3 Nginx動靜分離實現原理

1.2.3.1 動靜分離原理

伺服器接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源(音訊,圖片等)由Nginx提供服務,動態資源Nginx轉至後端( tomcat等)

1.2.3.2 Nginx靜態處理優勢

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

二 部署解析

2.1 Nginx+Tomcat負載均衡,動靜分離群集

以Nginx作為負載均衡器,Tomcat作為應用伺服器

2.2 Tomcat部署與測試網站搭建

1.要求部署兩臺後端Tomcat伺服器

2.為了進行測試,搭建兩個內容不同的網站

3.Tomcat部署與網站搭建步驟

 關閉firewalld防火牆
 安裝JDK,配置JAVA環境
 安裝配置Tomcat
 建立/web/webapp1目錄,修改server.xml,將網站檔案目錄更改到/web/webapp1/路徑下
  /web/webapp1/下建立測試頁面index.jsp,並進行測試

2.3 Nginx配置負載均衡,搭建分離

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

  關閉Firewalld防火牆
  安裝Nginx依賴軟體包
  解壓並編譯安裝Nginx
  配置nginx.conf,新增location靜態頁面處理及新增upstream配置段與proxy_pass
  檢測配置檔案與啟動Nginx
  測試負載均衡,動靜分離效果

三 部署流程

3.1 環境準備

3.1.1 配置裝置

nginx1:20.0.0.10(排程器1)
nginx2:20.0.0.11(排程器2)
tomcat1:20.0.0.12(節點伺服器1)
tomcat2:20.0.0.13(節點伺服器2)
nfs:20.0.0.14(儲存伺服器)
client:20.0.0.15(客戶機)

3.1.2 裝置重新命名

[root@server1 ~]# hostnamectl set-hostname nginx1
[root@server1 ~]# bash

[root@server2 ~]# hostnamectl set-hostname nginx2
[root@server2 ~]# bash

[root@client1 ~]# hostnamectl set-hostname tomcat1
[root@client1 ~]# bash

[root@server1 ~]# hostnamectl set-hostname tomcat2
[root@server1 ~]# bash

[root@localhost ~]# hostnamectl set-hostname nfs
[root@localhost ~]# bash

[root@server6 ~]# hostnamectl set-hostname client
[root@server6 ~]# bash

3.2 部署流程

3.2.1 在nfs儲存伺服器上

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

[root@nfs ~]# mkdir /web1
[root@nfs ~]# mkdir /web2
[root@nfs ~]# cd /web1
[root@nfs web1]# vi index.jsp   動態網頁格式(tomcat)
[root@nfs web1]# cp index.jsp /web2
[root@nfs web1]# cd /web2
[root@nfs web2]# vi index.jsp 
[root@nfs web2]# cd

配置

  區間      語言                   java庫      頁面編碼格式
<%@ 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表示頁面的編碼格式

2.在/web2/index.html上
在這裡插入圖片描述

3.配置檔案

[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    檢視共享情況

在這裡插入圖片描述

3.2.2 在web1,web2(tomcat1,tomcat2)上面

新增安裝包
apache-tomcat-8.5.16.tar.gz
jdk-8u91-linux-x64.tar.gz

在web1上

1.解壓縮

[root@tomcat1 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz 

2.設定環境變數

[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java
[root@tomcat1 ~]# vi /etc/profile

最後新增
export JAVA_HOME=/usr/local/java    定義變數,設定JAVA根目錄設為全域性變數
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre   
環境變數,在PATH環境變數中新增JAVA根目錄下的bin/子目錄,jre/子目錄

在這裡插入圖片描述
3.將java.sh指令碼匯入到環境變數,使其生效

[root@tomcat1 ~]# source /etc/profile   
[root@tomcat1 ~]# echo $PATH    輸出環境資訊
[root@tomcat1 ~]# java
[root@tomcat1 ~]# java -version   檢視版本

在這裡插入圖片描述

4.編寫java指令碼測試java是否可以正常使用

[root@tomcat1 ~]# vi abc.java   編寫指令碼
[root@tomcat1 ~]# javac abc.java  編譯指令碼
[root@tomcat1 ~]# java abc   執行顯示


public class abc {     定義類
        public static void main (String[] args) {
        System.out.println("hello world!!!"); 輸出
      }
}

在這裡插入圖片描述

在這裡插入圖片描述

以上說明java可以正常工作

5.開始安裝tomcat
web1上
1.解壓縮

[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz 
[root@tomcat1 ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8     目錄剪下

2.建立站點目錄

[root@tomcat1 ~]# mkdir /webapp1   
[root@tomcat1 ~]# cd /webapp1/ 
[root@tomcat1 webapp1]# ls -lh  新增圖片,之後掛載也會被覆蓋消失

3.掛載

[root@tomcat1 webapp1]# mount 20.0.0.14:/web1 /webapp1/
[root@tomcat1 webapp1]# df -Th
[root@tomcat1 webapp1]# cd

在這裡插入圖片描述
4.修改新增配置檔案,主頁的站點目錄

[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.1)

5.命令替換

[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  檢視埠資訊

在這裡插入圖片描述
6.在瀏覽器進行
http://20.0.0.12:8080
在這裡插入圖片描述
以上完成web1的配置

web2配置同上
1.安裝測試java是否正常工作
在這裡插入圖片描述
2.掛載
在這裡插入圖片描述

3.安裝tomcat並設定
在這裡插入圖片描述
在這裡插入圖片描述

4.在瀏覽器上測試
http://20.0.0.13:8080

在這裡插入圖片描述

3.2.3 部署排程器

在nginx1,nginx2上
新增nginx,keepalived安裝包

1.安裝Nginx依賴包

[root@nginx1 ~]# ls -lh
[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  建立不可登入,不帶宿主的使用者
[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/      建立命令連結(nginx命令使用前提)
[root@nginx1 nginx-1.13.7]# cd

2.配置檔案

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

新增    
upstream服務池
upstream tomcat_server {
             server 20.0.0.12:8080 weight=1;
              節點      ip地址  埠號  權重
             server 20.0.0.13:8080 weight=1;
}

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

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

3.2.3.1 解決靜態資源在nginx上顯示問題

http://20.0.0.10/index.jsp
發現圖片未顯示出來
在這裡插入圖片描述
在這裡插入圖片描述
進行抓包檢視

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

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

[root@nginx1 ~]# cd /usr/local/nginx/html/
[root@nginx1 html]# ls -lh

在這裡插入圖片描述
瀏覽器再次訪問
在這裡插入圖片描述
在這裡插入圖片描述
進行抓包檢視
在這裡插入圖片描述

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

3.2.3.2 在nginx2上同上完成配置安裝

在這裡插入圖片描述
在瀏覽器上訪問
http://20.0.0.11
在這裡插入圖片描述

http://20.0.0.11/index.jsp
在這裡插入圖片描述
在這裡插入圖片描述

3.2.4 在排程器上安裝keepalived

新增軟體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   編譯安裝

解析:

popt庫的存在,主要是為了解析命令列選項。相比手動的解析argv陣列或者使用getopt函式getopt( )或getopt_long( ), 使用popt庫在很多方面都佔有優勢。popt的一些特點:它不使用全域性變數,因此可以並行解析argv;它可以解析任意的argv風格的元素陣列,可以解析來自任何原始檔的命令列字串(ps:估計是命令列字串引數可儲存在檔案中,程式通過匯入配置檔案解析獲得引數) ;它提供了一個使用選項別名的標準方法(後面會再討論);它可以執行外部選項過濾器;最後,它能夠自動生成程式的help和usage資訊。

kernel-devel:做核心一般開發的,比如編寫核心模組,原則上,可以不需要核心的原始碼

2.編輯配置檔案

[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   
[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

修改
# chkconfig: 35 21 79  執行級別

在這裡插入圖片描述
3.編輯配置檔案

[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.225    定義虛擬ip(VIP)
}
}

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

在排程器2上完成keepalived的編譯安裝後從排程器1進行拷貝

排程器1上

[root@nginx1 keepalived-2.0.13]# scp /etc/keepalived/keepalived.conf      root@20.0.0.11:/etc/keepalived/     拷貝檔案

進入排程器2上進行檔案編輯

[root@nginx2 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 

修改
router_id nginx2   伺服器名稱
 state BACKUP      指定keepalived的角色,MASTER為主,BACKUP為備
 priority 105   優先順序

在這裡插入圖片描述

在排程器1上

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

[root@nginx1 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
[root@nginx1 keepalived-2.0.13]# scp /usr/local/src/nginx.sh root@20.0.0.11:/usr/local/src
[root@nginx1 keepalived-2.0.13]# chmod +x /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

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
2.服務啟動

[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   檢視虛擬地址

在這裡插入圖片描述
在這裡插入圖片描述
3.在排程器2上檢視

在這裡插入圖片描述
在這裡插入圖片描述
4.在瀏覽器上
http://20.0.0.225
在這裡插入圖片描述

http://20.0.0.225/index.jsp
在這裡插入圖片描述
在這裡插入圖片描述

3.2.4 模擬故障

3.2.4.1 當排程器1出現問題時,檢視是否高可用

在排程器1上

[root@nginx1 ~]# systemctl stop keepalived.service  
[root@nginx1 ~]# ip addr  虛擬地址消失

在這裡插入圖片描述
虛擬地址消失
在排程器2上

[root@nginx2 ~]# ip addr

在這裡插入圖片描述
說明主備轉換功能有效
瀏覽器再次訪問發現仍然可以訪問網頁
在這裡插入圖片描述
在這裡插入圖片描述

3.2.4.1 當節點1出現問題,檢視是否對訪問產生影響

當節點伺服器tomcat1出現問題時

[root@tomcat1 ~]# tomcatdown 

在這裡插入圖片描述
在瀏覽器上訪問發現只有tomcat2的頁面顯示
在這裡插入圖片描述


總結

通過以上的學習瞭解,學習到了nginx,tomcat之間的組合工作,應用效果之高效。

相關文章