1. 程式人生 > 其它 >Tomcat負載均衡

Tomcat負載均衡

目錄

一、Nginx+Tomcat負載均衡、動靜分離

Nginx 伺服器:192.168.80.13:80

Tomcat伺服器1:192.168.80.14:8080

Tomcat伺服器2(多例項):192.168.80.12:8080 192.168.80.12:8081

1.1、部署Nginx負載均衡器(192.168.80.13)

步驟和nginx安裝步驟一樣,多新增一個模組,我這邊就放整體步驟

systemctl stop firewalld
setenforce 0
#安裝所需開發包和編譯環境、編譯器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

#建立程式使用者
useradd -M -s /sbin/nologin nginx

#解壓安裝包
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/

#指定安裝路徑、指定使用者名稱、組名、啟用模組以支援統計狀態
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \							        #啟用檔案修改支援
--with-http_stub_status_module \					#啟用狀態統計
--with-http_gzip_static_module \					#啟用 gzip靜態壓縮
--with-http_flv_module \							#啟用 flv模組,提供對 flv 視訊的偽流支援
--with-http_ssl_module								#啟用 SSL模組,提供SSL加密功能
--with-stream                                       #啟用stream模組,提供四層排程

#編譯及安裝
make && make install

#軟連結便於系統識別nginx操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

#新增nginx系統服務
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

#賦權及開啟服務、開啟開機自啟
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

1.2、部署單個例項tomcat伺服器(192.168.80.15)

#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

#安裝JDK
cd /opt
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

#設定JDK環境變數
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile

#安裝啟動Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

1.3、部署兩個例項tomcat伺服器(192.168.80.12)

上篇部落格內容,這邊不再複述

1.4、動靜分離配置

1.4.1、多例項動態分離配置(192.168.80.12)

①例項1

mkdir /usr/local/tomcat/tomcat1/webapps/test #建立動態測試檔案

vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp #動態頁面顯示內容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定為test1頁面
</head>
<body>
<% out.println("test1 test1 test1 ");%>
</body>
</html>  
vim /usr/local/tomcat/tomcat1/conf/server.xml     #刪除前面的HOST配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host> 

/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh 

②例項2

mkdir /usr/local/tomcat/tomcat2/webapps/test #建立動態測試檔案

vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp #動態頁面顯示內容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定為test2頁面
</head>
<body>
<% out.println("test2 test2 test2");%>
</body>
</html>  
vim /usr/local/tomcat/tomcat2/conf/server.xml     #刪除前面的HOST配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host> 

/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh 

1.4.2、單例項Tomcat的server配置(192.168.80.15)

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>     #指定為test3頁面
</head>
<body>
<% out.println("test3 test3 test3");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml     #刪除前面的HOST配置 
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
</Context>
</Host> 

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

1.5、Nginx的七層代理配置(192.168.80.13)

1.5.1準備靜態頁面和靜態圖片

echo '<html><body><h1>111222333</h1></body></html>' > /usr/local/nginx/html/index.html #準備靜態網頁
mkdir /usr/local/nginx/html/img

cp /root/1.png /usr/local/nginx/html/img #準備圖片檔案

1.5.2、Nginx配置檔案修改

vim /usr/local/nginx/conf/nginx.conf

......
http {
......
#gzip on;
upstream tomcat_server {         #配置負載均衡的伺服器列表,weight引數表示權重,權重越高,被分配到的概率越大
	server 192.168.80.12:8080 weight=1;
    server 192.168.80.12:8081 weight=1;
	server 192.168.80.15:8080 weight=1;
}

server {
	listen 80;
	server_name www.123.com;

	charset utf-8;

	#access_log logs/host.access.log main;
	
	
	location ~ .*\.jsp$ {                   #配置Nginx處理動態頁面請求,將 .jsp檔案請求轉發到Tomcat 伺服器處理
		proxy_pass http://tomcat_server;   
		proxy_set_header HOST $host;    #設定後端的Web伺服器可以獲取遠端客戶端的真實IP;設定後端的Web伺服器接收到的請求訪問的主機名(域名或IP、埠),預設host的值為proxy_pass指令設定的主機名
		proxy_set_header X-Real-IP $remote_addr;  #把$remote_addr賦值給X-Real-IP,來獲取源IP
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;               #在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
	}
	
	
	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
		root /usr/local/nginx/html/img;      #配置Nginx處理靜態圖片請求
		expires 1d;
	}
	
	location / {
		root html;
		index index.html index.htm;
	}
......
}
......
}

systemctl restart nginx.service

1.5.3、瀏覽器驗證

1.6、Nginx的四層代理配置(192.168.80.13)

vim /usr/local/nginx/conf/nginx.conf
stream {                        #與http同等級,一般在http上面設定
upstream appserver {
server 192.168.80.11:8080 weight=1;
server 192.168.80.11:8081 weight=1;
server 192.168.80.13:8080 weight=1; 
} 
server {
 listen 8080;
 proxy_pass appserver;
}
}
server {
	listen 80;
	server_name www.gxd.com;
	charset utf-8;
	#access_log logs/host.access.log main;
	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
		root /usr/local/nginx/html/img;      #配置Nginx處理靜態圖片請求
		expires 1d;
	}
systemctl restart nginx

1.6.1、7層代理與4層代理區別

反向代理方式 說明
四層反向代理 是基於IP+PROT(TCP/UDP)轉發
七層反向代理 是基於http/https/mail等代理轉發

1.7、Nginx負載均衡模式

負載均衡模式 說明
rr負載均衡模式 每個請求按時間順序逐一分配到不同的後端伺服器,如果超過了最大失敗次數後(max_fails,預設1),在失效時間內(fail_timeout,預設10秒),該節點失效權重變為0,超過失效時間後,則恢復正常,或者全部節點都為down後,那麼將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。
least_conn最少連線 優先將客戶端請求排程到當前連線最少的伺服器。
ip_hash負載均衡模式 每個請求按訪問ip的hash結果分配,這樣每個訪客固定一個後端伺服器,可以解決session的問題,但是ip_hash會造成負載不均,有的服務請求接收多,有的服務請求接收少,所以不建議採用ip_hash模式,session共享問題可用後端服務的session共享代替nginx的ip_hash。
fair(第三方)負載均衡模式 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
url_hash(第三方)負載均衡模式 和ip_hash演算法類似,是對每個請求按ur來的hash結果匹配,使每個url定向到同一個後端伺服器,但是也會造成分配不均的問題,這種模式後端伺服器為快取時比較好。