伺服器群集—Nginx+Tomcat+keepalived負載均衡、動靜分離群集
一、架構解析
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 配置環境
記得改名及所有伺服器關閉防火牆
nginx1 | 20.0.0.11(排程器1) |
---|---|
nginx2 | 20.0.0.12(排程器2) |
tomcat1 | 20.0.0.13(節點伺服器1) |
tomcat2 | 20.0.0.14(節點伺服器2) |
nfs | 20.0.0.15(儲存伺服器) |
client | 20.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.1)
4.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的頁面
相關文章
- Nginx—tomcat負載均衡動靜分離群集NginxTomcat負載
- Nginx+Tomcat負載均衡,動靜分離群集部署解析NginxTomcat負載
- 帶你瞭解Nginx+Tomcat負載均衡,動靜分離群集NginxTomcat負載
- LVS負載均衡群集負載
- 伺服器群集—LVS負載均衡群集(LVS-NAT部署)伺服器負載
- 伺服器群集LVS負載均衡-NAT伺服器負載
- LVS負載均衡群集--NAT模式負載模式
- Haproxy搭建 Web 群集實現負載均衡Web負載
- LVS負載均衡群集概念、NAT模式LVS負載均衡實戰部署負載模式
- Nginx 動靜分離與負載均衡的實現Nginx負載
- Nginx使用篇:實現負載均衡、限流與動靜分離Nginx負載
- 伺服器群集—Haproxy+keepalived群集伺服器
- Nginx+Tomcat實現負載均衡、動靜分離叢集部署NginxTomcat負載
- Tomcat+Nginx實現動靜分離和負載均衡架構部署TomcatNginx負載架構
- 負載均衡和動態負載均衡分別是什麼?-VeCloud負載Cloud
- 《Nginx系列》之青銅入門篇 反向代理 負載均衡 動靜分離就是這麼簡單Nginx負載
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- 伺服器負載均衡伺服器負載
- Sqlserver 2014 alwayson故障轉移群集節點被踢出群集SQLServer
- openGauss JDBC客戶端負載均衡與讀寫分離JDBC客戶端負載
- 資料庫的讀寫分離與負載均衡策略資料庫負載
- LVS+Keepalived群集
- RabbitMQ 群集安裝MQ
- MySQL Route負載均衡與讀寫分離Docker環境使用MySql負載Docker
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- 一、群集的簡介
- 使用haproxy搭建web群集Web
- docker+mysql叢集+讀寫分離+mycat管理+垂直分庫+負載均衡DockerMySql負載
- windows伺服器第四層負載均衡_基於NLB負載均衡詳解Windows伺服器負載
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- LVS+Keepalived高可用群集
- Nginx負載均衡反向代理伺服器Nginx負載伺服器
- 負載均衡負載
- 【Tony 老師】基於 Maxscale 實現讀寫分離和負載均衡負載
- nginx負載均衡原理分析到手動編寫簡易負載均衡器Nginx負載
- 11,nginx動靜分離Nginx
- 伺服器負載均衡(Server Load Balance,SLB)伺服器負載Server