今天千鋒扣丁學堂Linux培訓老師給你們分享一篇關於如何輕鬆配置Nginx+Tomcat的集羣和負載均衡的詳細介紹,首先Tomcat集羣是當單臺服務器達到性能瓶頸,經過橫向擴展的方式提升總體系統性能的有效手段。Nginx是一個高性能的HTTP和反向代理web服務器,能夠經過簡單的配置實現Tomcat集羣的負載均衡。本文使用的Tomcat是8.5.35版本,Nginx是1.14.2版本。css
1.概述html
對於Web應用來講,集羣最大的問題就是Session信息的共享,通常有如下解決方法:nginx
使用粘性會話,好比,使用IPHash的負載均衡策略,將當前用戶的請求都集中到一臺服務器上;缺點是單點故障,會話丟失web
使用Session複製,使用Tomcat自帶的Session複製策略,將會話信息同步到集羣的各個節點;缺點是消耗更多內存和帶寬,適用於小型集羣數據庫
使用第三方緩存中間件緩存整個集羣會話信息,好比Redis緩存,可由應用程序控制與Session的關聯,也能夠適配Tomcatapache
固然了,也能夠把會話信息存到共享文件系統或者數據庫windows
在配置Nginx的過程當中,可能會遇到如下問題:瀏覽器
配置upstream名稱時不能使用下劃線,好比tomcat_ha,不然Tomcat會拋出Thecharacter[_]isnevervalidinadomainname的異常緩存
在windows上殺掉全部的nginx.exe進程,taskkill/fi"imagenameeqnginx.exe"/ftomcat
在windows上有個pid爲4的系統進程會佔用80端口,因此這裏將nginx改成了8000
在配置Tomcat集羣的過程當中,須要注意的問題:
確保web.xml配置了元素
確保Context的Manager別被替換成了標準會話管理器
Receiver.address不要配置成auto,由於默承認能會綁定127.0.0.1;Receiver.port可改也可不改,Tomcat會自行檢測4000-4100範圍內的可用端口,自動處理衝突
若是在不一樣服務器上,須要關閉防火牆或開端口,還有時間同步
2.Nginx核心配置
Nginx使用的是默認配置,添加和修改的核心配置以下:
http {
...
#gzip on;
#設置負載均衡的服務器列表和權重
upstream tomcat-ha {
#ip_hash; server 172.31.1.41:8080 weight=1; server 172.31.1.42:8080 weight=1;
}
server {
listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; #轉發請求 proxy_pass http://tomcat-ha$request_uri; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ...
}
}
3.Tomcat集羣配置
啓用集羣配置,在元素中添加如下配置:
<!-- channelSendOptions=6 同步複製 -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
<!-- 集羣 Session 管理器 -->
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/>
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
-->
<!-- 集羣內部通訊配置 -->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.10.2" port="5000" selectorTimeout="100" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<!-- 此 vavle 攔截請求,並將 Session 信息發給內部節點 -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
簡單描述下工做原理:
nginx將請求轉發給Tomcat1,請求登陸認證,建立會話,生成Cookie,在響應返回以前,將Session信息複製到Tomcat2
再次請求時,nginx將帶着會話Cookie的請求轉發給了Tomcat2,Tomcat2發現內部Session池中有關聯的已認證成功的Session對象,再也不認證返回請求資源
4.驗證負載均衡和Session複製
4.1測試環境
使用兩臺PC部署Tomcat,對應關係是:172.31.1.41-Tomcat1,172.31.1.42-Tomcat2
部署基於使用Tomcat自帶的SessionExample程序,編寫了一個tomcat-benchmark的web應用
結合Tomcat自帶的Manager應用,查看已部署應用內部Session池
4.2負載均衡
修改tomcat-benchmark部署描述符文件中的context-param爲"I'mTomcat1/2"用於區分兩個Tomcat,啓動Nginx和Tomcat,在瀏覽器訪問172.31.1.42:8000能夠看到請求在兩個服務器間切換:
4.3Session複製
爲了方便理解,這裏先把Nginx的負載均衡策略設置成ip_hash:
假設Nginx始終將請求定位到Tomcat1上,而後在Tomcat1上建立會話,往會話中添加一些屬性
關閉Tomcat1模擬故障,此時Nginx會帶着以前的會話Cookie將請求轉發到Tomcat2,上
查看Tomcat2上是否存在與Cookie(JSESSIONID)關聯的Session信息,如有表示複製成功
整個過程以下:
正好與上述描述的相反,能夠看到Session信息從Tomcat2複製到了Tomcat1中。
以上就是關於千鋒扣丁學堂Linux培訓之如何輕鬆配置Nginx+Tomcat的集羣和負載均衡的所有內容,最後想要了解更多關於Linux方面內容的小夥伴,請關注扣丁學堂Linux培訓官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺爲您提供權威的Linux開發視頻,Linux培訓後的前景無限,行業薪資和將來的發展會愈來愈好的,扣丁學堂老師精心推出的Linux在線教程定能讓你快速掌握Linux從入門到精通開發實戰技能。