使用Nginx+Tomcat實(shí)現(xiàn)負(fù)載均衡的全過(guò)程
Nginx + Tomcat 實(shí)現(xiàn)負(fù)載均衡
1. 環(huán)境
Linux version: 5.4.0-96-generic OS Version: ubuntu1~20.04 Architecture: amd64 Nginx version: nginx/1.18.0 (Ubuntu) JVM Version: 11.0.15+10-Ubuntu-0ubuntu0.20.04.1 Tomcat Version: Apache Tomcat/9.0.63
2. 安裝
2.1 安裝 Nginx
在命令行輸入:
sudo apt-get install nginx
測(cè)試命令:
sudo nginx -t
窗口顯示:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
在瀏覽器輸入服務(wù)器 ip:

2.2 安裝 Java
安裝 jdk:
sudo apt-get -y install openjdk-11-jdk
查看版本:
java --version
輸出如下:
openjdk 11.0.15 2022-04-19 OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1) OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)
安裝成功。
查看 Java 的安裝位置:
update-alternatives --config java
輸出如下:
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java
將 $JAVA_HOME 添加到環(huán)境變量:
sudo vim $HOME/.bashrc shift+G
在行尾添加:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$PATH:$JAVA_HOME
退出 vim ,激活環(huán)境變量:
source $HOME/.bashrc
驗(yàn)證環(huán)境變量:
echo $JAVA_HOME
輸出如下,激活成功。
/usr/lib/jvm/java-11-openjdk-amd64
2.3 安裝 Tomcat
官網(wǎng)下載的 Tomcat 9.0.63,注意需為 Core/tar.gz(pgp, sha512) 版本,或 點(diǎn)此下載 ,將文件上傳到服務(wù)器中的路徑 /usr/local 下,輸入下列命令解壓:
cd /usr/local && tar -zxvf apache-tomcat-9.0.63.tar.gz
配置環(huán)境變量,打開(kāi) Tomcat 啟動(dòng)腳本:
cd apache-tomcat-9.0.63 && vim bin/startup.sh shift+G
在語(yǔ)句 exec "$PRGDIR"/"$EXECUTABLE" start "$@" 的上一行插入下列語(yǔ)句:
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 JRE_HOME=$JAVA_HOME/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME CLASSPATH=.:$JRE_HOME/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar TOMCAT_HOME=/usr/local/apache-tomcat-9.0.63
保存并退出。
開(kāi)放服務(wù)器的 8080 端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重啟防火墻
systemctl restart firewalld.service
去云服務(wù)器管理控制臺(tái)添加安全組:

運(yùn)行:
./bin/shutdown.sh && rm -rf logs/catalina.out && ./bin/startup.sh ; tail -f logs/catalina.out
輸出應(yīng)該如下所示:

在瀏覽器訪問(wèn) $ip:8080,顯示:

說(shuō)明你配置成功。
3. 部署
3.1 Tomcat 服務(wù)器部署
本實(shí)驗(yàn)需要使用 3 個(gè)端口,分別使用 8001,8082,8083,在騰訊云控制臺(tái)開(kāi)放端口后,在 shell 中手動(dòng)開(kāi)放端口并重啟防火墻:
firewall-cmd --zone=public --add-port=8081/tcp --permanent firewall-cmd --zone=public --add-port=8082/tcp --permanent firewall-cmd --zone=public --add-port=8083/tcp --permanent systemctl restart firewalld.service
注意去騰訊云開(kāi)啟你的安全組
我們使用 Tomcat 自帶的 3 個(gè) Web 項(xiàng)目來(lái)實(shí)現(xiàn)不同的端口訪問(wèn)不同的應(yīng)用,假設(shè)你完全按照上文的方式操作,那么此時(shí)你的 Tomcat 為 /usr/local/apache-tomcat-9.0.63,根據(jù)根路徑打開(kāi)服務(wù)器的配置文件:
cd /usr/local/apache-tomcat-9.0.63/conf && vim server.xml
刪除掉原代碼,換成以下代碼:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ROOT" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="examples" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina3">
<Connector port="8083" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina3" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="examples/websocket" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
這樣,通過(guò) $ip:8081、$ip:8082、$ip:8083 分別訪問(wèn)就可以得到不同的服務(wù)端。
8083 端口的資源不完整,因?yàn)?Tomcat 默認(rèn)只提供了 2 個(gè)有效的 app,第三個(gè)端口會(huì)返回一個(gè) 404 頁(yè)面,某種程度上它也是一個(gè)應(yīng)用。
3.2 Nginx 反向代理
編輯 nginx.conf 配置文件:
vim /etc/nginx/nginx.conf
將下列語(yǔ)句插入到模塊 http 的末尾:
upstream tomcat_server {
server 101.42.117.143:8081;
server 101.42.117.143:8082;
server 101.42.117.143:8083;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
啟動(dòng)或重啟 nginx:
nginx 或 nginx -s reload
這樣,可以直接訪問(wèn) 80 端口,或 $ip 后將其代理到后端的 3 臺(tái)服務(wù)器上。
nginx 默認(rèn)采用輪詢策略。
4. 負(fù)載均衡
4.1 輪詢
輪詢策略 nginx.conf 的配置如下:
upstream tomcat_server {
server 101.42.117.143:8081 weight=1;
server 101.42.117.143:8082 weight=1;
server 101.42.117.143:8083 weight=1;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重啟 nginx:
nginx -s reload
使用 postman 頻繁訪問(wèn),頁(yè)面出現(xiàn)的頻率是 ABC ABC ABC ABC。
4.2 加權(quán)輪詢
加權(quán)輪詢策略 nginx.conf 的配置如下:
upstream tomcat_server {
server 101.42.117.143:8081 weight=1;
server 101.42.117.143:8082 weight=3;
server 101.42.117.143:8083 weight=5;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重啟 nginx:
nginx -s reload
使用 postman 頻繁訪問(wèn),頁(yè)面出現(xiàn)的頻率是 CBCACBCBC CBCACBCBC。
該算法稱為提案者輪換選擇算法,每一輪都會(huì)將被選中的對(duì)象減去總權(quán)重值,每一輪都會(huì)將各結(jié)點(diǎn)的權(quán)重值加上固定的預(yù)設(shè)權(quán)重值,這是一個(gè)公平的輪換算法,可以防止權(quán)重過(guò)大的結(jié)點(diǎn)持續(xù)占據(jù)資源。過(guò)程如下:
| 初始權(quán)重 | 加權(quán) | 選擇 | 選中者減去權(quán)重和 |
|---|---|---|---|
| 0 0 0 | 1 3 5 | C | 1 3 -4 |
| 1 3 -4 | 2 6 1 | B | 2 -3 1 |
| 2 -3 1 | 3 0 6 | C | 3 0 -3 |
| 3 0 -3 | 4 3 2 | A | -5 3 2 |
| -5 3 2 | -4 6 7 | C | -4 6 -2 |
| -4 6 -2 | -3 9 3 | B | -3 0 3 |
| -3 0 3 | -2 3 8 | C | -2 3 -1 |
| -2 3 -1 | -1 6 4 | B | -1 -3 4 |
| -1 -3 4 | 0 0 9 | C | 0 0 0 |
| 0 0 0 | 1 3 5 | C | 1 3 -4 |
| 1 3 -4 | 2 6 1 | B | 2 -3 1 |
| 2 -3 1 | 3 0 6 | C | 3 0 -3 |
| … | … | … | … |
4.2 IP Hash
IP Hash 策略 nginx.conf 的配置如下:
upstream tomcat_server {
server 101.42.117.143:8081;
server 101.42.117.143:8082;
server 101.42.117.143:8083;
ip_hash;
}
server {
listen 80;
server_name 101.42.117.143;
location / {
proxy_pass http://tomcat_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重啟 nginx:
nginx -s reload
它會(huì)將主機(jī)的 $ip 哈希映射到一個(gè)隨機(jī)的固定值,然后對(duì) 3 取模得到響應(yīng)的端口序號(hào);
使用主機(jī) 1 的 postman 頻繁訪問(wèn),頁(yè)面出現(xiàn)的頻率是 AAAAAA;
使用主機(jī) 2 的 postman 頻繁訪問(wèn),頁(yè)面出現(xiàn)的頻率是 BBBBBB。
總結(jié)
到此這篇關(guān)于使用Nginx+Tomcat實(shí)現(xiàn)負(fù)載均衡的文章就介紹到這了,更多相關(guān)Nginx+Tomcat負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kubernetes之安裝nginx-controller作為統(tǒng)一網(wǎng)關(guān)方式
這篇文章主要介紹了Kubernetes之安裝nginx-controller作為統(tǒng)一網(wǎng)關(guān)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
服務(wù)器報(bào)錯(cuò)nginx?502?Bad?Gateway的原因及如何解決詳解
項(xiàng)目啟動(dòng)時(shí)莫名其妙網(wǎng)站訪問(wèn)不了,502 Bad Gateway,下面這篇文章主要給大家介紹了關(guān)于服務(wù)器報(bào)錯(cuò)nginx?502?Bad?Gateway的原因及如何解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
nginx?ingress代理websocket流量的配置方法
ingress?nginx默認(rèn)支持websocket協(xié)議,使用長(zhǎng)連接協(xié)議時(shí)需要注意連接超時(shí)的設(shè)置,文中有提到讀取和發(fā)送超時(shí)的注解參數(shù),通過(guò)本文閱讀可以快速掌握,對(duì)nginx?ingress代理websocket相關(guān)知識(shí)感興趣的朋友一起看看吧2022-03-03
Nginx啟動(dòng)時(shí)80端口被占用的問(wèn)題解決
本文主要介紹了在啟動(dòng)Nginx時(shí)遇到80端口被占用的問(wèn)題及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
nginx配置客戶端保存cookie的實(shí)現(xiàn)
本文主要介紹了nginx配置客戶端保存cookie的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
nginx中proxy_set_header參數(shù)的實(shí)現(xiàn)
本文詳細(xì)介紹了Nginx中proxy_set_header指令的用法,通過(guò)設(shè)置不同的請(qǐng)求頭信息,可以實(shí)現(xiàn)更靈活的反向代理功能,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Nginx服務(wù)器中使用gzip壓縮的相關(guān)配置解析
這篇文章主要介紹了Nginx服務(wù)器中使用gzip壓縮的相關(guān)配置解析,包括對(duì)gzip請(qǐng)求處理相關(guān)的壓縮配置,需要的朋友可以參考下2015-12-12

