千鋒扣丁學堂Linux培訓之如何輕鬆配置Nginx+Tomcat的集羣和負載均衡

今天千鋒扣丁學堂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從入門到精通開發實戰技能。

相關文章
相關標籤/搜索