<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Nginx + Tomcat 實現負載均衡
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
在命令列輸入:
sudo apt-get install nginx
測試命令:
sudo nginx -t
視窗顯示:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
在瀏覽器輸入伺服器 ip:
安裝 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 新增到環境變數:
sudo vim $HOME/.bashrc shift+G
在行尾新增:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$PATH:$JAVA_HOME
退出 vim
,啟用環境變數:
source $HOME/.bashrc
驗證環境變數:
echo $JAVA_HOME
輸出如下,啟用成功。
/usr/lib/jvm/java-11-openjdk-amd64
官網下載的 Tomcat 9.0.63
,注意需為 Core/tar.gz(pgp, sha512)
版本,或 點此下載 ,將檔案上傳到伺服器中的路徑 /usr/local
下,輸入下列命令解壓:
cd /usr/local && tar -zxvf apache-tomcat-9.0.63.tar.gz
設定環境變數,開啟 Tomcat
啟動指令碼:
cd apache-tomcat-9.0.63 && vim bin/startup.sh shift+G
在語句 exec "$PRGDIR"/"$EXECUTABLE" start "$@"
的上一行插入下列語句:
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
儲存並退出。
開放伺服器的 8080
埠:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重啟防火牆
systemctl restart firewalld.service
去雲伺服器管理控制檯新增安全組:
執行:
./bin/shutdown.sh && rm -rf logs/catalina.out && ./bin/startup.sh ; tail -f logs/catalina.out
輸出應該如下所示:
在瀏覽器存取 $ip:8080
,顯示:
說明你設定成功。
本實驗需要使用 3 個埠,分別使用 8001,8082,8083,在騰訊雲控制檯開放埠後,在 shell 中手動開放埠並重啟防火牆:
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
注意去騰訊雲開啟你的安全組
我們使用 Tomcat 自帶的 3 個 Web 專案來實現不同的埠存取不同的應用,假設你完全按照上文的方式操作,那麼此時你的 Tomcat 為 /usr/local/apache-tomcat-9.0.63
,根據根路徑開啟伺服器的組態檔:
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>
這樣,通過 $ip:8081
、$ip:8082
、$ip:8083
分別存取就可以得到不同的伺服器端。
8083 埠的資源不完整,因為 Tomcat 預設只提供了 2 個有效的 app,第三個埠會返回一個 404 頁面,某種程度上它也是一個應用。
編輯 nginx.conf
組態檔:
vim /etc/nginx/nginx.conf
將下列語句插入到模組 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; } }
啟動或重啟 nginx:
nginx 或 nginx -s reload
這樣,可以直接存取 80
埠,或 $ip
後將其代理到後端的 3 臺伺服器上。
nginx 預設採用輪詢策略。
輪詢策略 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 頻繁存取,頁面出現的頻率是 ABC ABC ABC ABC
。
加權輪詢策略 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 頻繁存取,頁面出現的頻率是 CBCACBCBC CBCACBCBC
。
該演演算法稱為提案者輪換選擇演演算法,每一輪都會將被選中的物件減去總權重值,每一輪都會將各結點的權重值加上固定的預設權重值,這是一個公平的輪換演演算法,可以防止權重過大的結點持續佔據資源。過程如下:
初始權重 | 加權 | 選擇 | 選中者減去權重和 |
---|---|---|---|
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 |
… | … | … | … |
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
它會將主機的 $ip 雜湊對映到一個隨機的固定值,然後對 3 取模得到響應的埠序號;
使用主機 1 的 postman 頻繁存取,頁面出現的頻率是 AAAAAA;
使用主機 2 的 postman 頻繁存取,頁面出現的頻率是 BBBBBB。
到此這篇關於使用Nginx+Tomcat實現負載均衡的文章就介紹到這了,更多相關Nginx+Tomcat負載均衡內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45