Nginx+Tomcat負載均衡,動靜分離群集部署解析
前言
通過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之間的組合工作,應用效果之高效。
相關文章
- 帶你瞭解Nginx+Tomcat負載均衡,動靜分離群集NginxTomcat負載
- Nginx—tomcat負載均衡動靜分離群集NginxTomcat負載
- Nginx+Tomcat實現負載均衡、動靜分離叢集部署NginxTomcat負載
- 伺服器群集—Nginx+Tomcat+keepalived負載均衡、動靜分離群集伺服器NginxTomcat負載
- Nginx+Tomcat部署負載均衡NginxTomcat負載
- Tomcat+Nginx實現動靜分離和負載均衡架構部署TomcatNginx負載架構
- Nginx 動靜分離與負載均衡的實現Nginx負載
- LVS負載均衡群集概念、NAT模式LVS負載均衡實戰部署負載模式
- LVS負載均衡群集負載
- 伺服器群集—LVS負載均衡群集(LVS-NAT部署)伺服器負載
- Nginx使用篇:實現負載均衡、限流與動靜分離Nginx負載
- Nginx+Tomcat實現動靜分離NginxTomcat
- nginx+tomcat實現負載均衡NginxTomcat負載
- LVS負載均衡群集--NAT模式負載模式
- Haproxy搭建 Web 群集實現負載均衡Web負載
- 伺服器群集LVS負載均衡-NAT伺服器負載
- 負載均衡和動態負載均衡分別是什麼?-VeCloud負載Cloud
- Linux環境搭建Nginx+Tomcat負載均衡叢集LinuxNginxTomcat負載
- 《Nginx系列》之青銅入門篇 反向代理 負載均衡 動靜分離就是這麼簡單Nginx負載
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- 使用Redis儲存Nginx+Tomcat負載均衡叢集的SessionRedisNginxTomcat負載Session
- openGauss JDBC客戶端負載均衡與讀寫分離JDBC客戶端負載
- 資料庫的讀寫分離與負載均衡策略資料庫負載
- Kuberntes部署MetalLB負載均衡器負載
- MySQL Route負載均衡與讀寫分離Docker環境使用MySql負載Docker
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- dubbo原始碼解析之負載均衡原始碼負載
- dubbo(三):負載均衡實現解析負載
- 負載均衡是什麼?怎麼理解負載均衡的部署方式和工作原理負載
- docker+mysql叢集+讀寫分離+mycat管理+垂直分庫+負載均衡DockerMySql負載
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- Dubbo原始碼解析之負載均衡策略原始碼負載
- 負載均衡負載
- 【Tony 老師】基於 Maxscale 實現讀寫分離和負載均衡負載
- nginx部署基於http負載均衡器NginxHTTP負載
- Nginx反向代理負載均衡的容器化部署Nginx負載
- nginx負載均衡原理分析到手動編寫簡易負載均衡器Nginx負載