Tomcat負載均衡
阿新 • • 發佈:2021-08-19
目錄
- 一、Nginx+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定向到同一個後端伺服器,但是也會造成分配不均的問題,這種模式後端伺服器為快取時比較好。 |