建站技術網專注分享網站建設技術,網站建設教程,真正幫你學會做網站技術,輕松解決網站建設過程中遇到的常見問題,為廣大站長服務。 網站地圖 | 收藏本站 | 訂閱
域名投資,就來找米網,認準網址:www.zhaomi.cc 專業仿站,就到仿站網:www.fangzhan.org
  站內公告: ·帝國cms教程內容已更新,歡迎關注     ·建站技術網采用阿里云服務器,備案已通    
您當前的位置:建站技術網 > 服務器教程 > tomcat教程

Tomcat學習總結(8)——Tomcat+Nginx集群解決均衡負載及生產環境熱部署

時間:2018-02-04 15:18:54  來源:網絡收集  整理: 建站技術網 www.txwlqq.com     點擊:19次

近日,為解決生產環境熱部署問題,決定在服務器中增加一個tomcat組成集群,利用集群解決熱部署問題。

這樣既能解決高并發瓶頸問題,又能解決熱部署(不影響用戶使用的情況下平滑更新生產服務器)問題。

因為項目是前后端分離的,所以本以為成本很低,沒想到遇到了一系列的坑,解決了2天才搞定,發現了很多不是集群而是項目本身的問題。

我是同一個服務器下配置tomcat和nginx等,本文主要面向有一定基礎的讀者,基本配置就不在本文累述了(基礎問題可以留言或者發郵件)。

0x0_1 服務器環境

服務器: CentOS 6.5

web容器:Tomcat 7.0.25

反向代理:Nginx 1.8

java: jdk 1.7

0x0_2 集群

我是同一個服務器部署兩個tomcat,所以地址是127.0.0.1 也可以換成其他服務器的ip

tomcat文件名ip地址端口項目名
tomcat7-1127.0.0.18080borrow
tomcat7-2127.0.0.18090borrow

0x1 tomcat集群配置

修改tomcat的conf/server.xml 如下

tomcat7-1:

<Server port="8005" shutdown="SHUTDOWN"><Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

compression="on"

compressionMinSize="2048"

noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />123456789123456789

tomcat7-2:

<Server port="8015" shutdown="SHUTDOWN"><Connector port="8090" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

compression="on"

compressionMinSize="2048"

noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /><Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />123456789123456789

以上配置,只有端口號(port)是必要配置,其他按平常配置即可,多個tomcat以此類推。

創建測試頁面

自己分別在tomcat中創建測試頁面,可以區分不同的tomcat服務器即可

<table align="centre" border="1">

<tr>

<td>Tomcat7_1 Session ID</td>

<% session.setAttribute("www.zemo.com","www.zemo.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr></table>12345678910111234567891011

啟動2個tomcat,確認都啟動了即可。

0x2 nginx均衡負載配置

這里使用ip_hash 集群方式,盡量分流。但是如果是同一個局域網下用戶大量訪問就沒有用了,不過可以再增加其他的措施,比如緩存session,因為這里主要是為了解決熱部署問題, 所以都不是問題。

upstream borrow {

ip_hash;

server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=20s;

server 127.0.0.1:8090 weight=1 max_fails=3 fail_timeout=20s;

}

server {

listen 80;

server_name www.zemo.com;#這個是隨便寫的...不用訪問了

access_log /usr/local/var/log/nginx/borrow_access.log;

location / {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

client_max_body_size 20m;

client_body_buffer_size 128k;

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 900;

proxy_buffer_size 4k;

proxy_buffers 4 32k;

proxy_busy_buffers_size 64k;

proxy_temp_file_write_size 64k;

proxy_pass http://borrow; #這里borrow 指向上面名為borrow的upstream

}

}123456789101112131415161718192021222324252627123456789101112131415161718192021222324252627

  • weight 訪問權重

  • max_fails 最大失敗次數

  • fail_timeout 最大失敗等待時間

測試配置是否正確

zemochen:Program SuperZemo$ sudo nginx -t

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok

nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful123123

重啟nginx

zemochen:Program SuperZemo$ sudo nginx -s reload11

觀察tomcat的session

  • 先訪問以下www.zemo.com

  • 關閉tomcat7_1,只留tomcat7_2觀察session id

  • 開啟tomcat7_1,關閉tomcat7_2觀察session id

你會發現兩個session id,下面講解tomcat 的session共享

0x3 tomcat session共享

0x3_1 server.xml配置

tomcat 有自帶復制session功能,在server.xml中增加<Cluster> 配置即可,不知道寫在哪里的,找到server.xml中的<Cluster>注釋樣例,寫在下面即可;旧暇褪菍懺<Host></Host>里面最后就行了。配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.BackupManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="6"/>

<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="127.0.0.1" <!--這里寫本tomcat的IP地址 -->

port="5000"

selectorTimeout="100" /> <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.MessageDispatch15Interceptor"/>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/></Cluster>12345678910111213141516171819202122232425262728293031321234567891011121314151617181920212223242526272829303132

修改server.xml 中的<Engine> 增加jvmRoute="tomcat7-1",配置如下:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7-1">11

tomcat7-2同理,配置這兩個。

0x3_2 web.xml配置

conf/web.xml中的<webapp></webapp> 中增加<distributable /> 我的項目是j2ee項目,所以寫在了項目的web.xml 里,項目中的web.xml優先級高于tomcat本身的。

配置代碼塊如下:

<web-app>

<!--其他配置省略,下面mime-mapping 也是與本問無關,為了體現最下面所以帶了一部分-->

<mime-mapping>

<extension>apk</extension>

<mime-type>application/vnd.android.package-archive</mime-type>

</mime-mapping>

<distributable /></web-app>1234567812345678

0x4 注意:

這里要注意,Nginx只需要配置一份,而tomcat有幾個節點,server.xml 、web.xml就配置幾個:

  • shutdown端口都不同

  • Connect 的http端口都不同

  • Ajp 端口不同

  • <Cluster> 中的<Receiver> 屬性 address 指向改tomcat的IP地址

  • <Engine> 中的jvmRoute 名要與tomcat文件名相同

0x5 結果截圖

整個環境全都啟動后, 訪問域名, 可以看到如下截圖,我的圖可以看出,訪問到的是tomcat7-1,注意,我的測試網頁并沒有寫tomcat7-1,而是自己加到session id里的,這里是自動增加jvmRoute的值,說明session復制成功…

Nginx+Tomcat集群解決均衡負載及生產環境熱部署

因為剛才確定被代理到了tomcat7-1,我們用的是ip_hash的分配方式,所以我們直接關閉tomcat7-1,再刷新頁面,確保代理到另一個tomcat,效果圖如下,可以看到只有后綴.tomcat7-2不同,至此一個均衡負載集群就可以了,既解決了熱部署問題,又解決了分擔服務器壓力,負載均衡問題。

Nginx+Tomcat集群解決均衡負載及生產環境熱部署


標簽:
文章標題: Tomcat學習總結(8)——Tomcat+Nginx集群解決均衡負載及生產環境熱部署
文章網址:http://www.txwlqq.com/fuwuqiJiaocheng/tomcat/3882.html
上一篇: Tomcat學習總結(7)——Tomcat與Jetty比較
下一篇: Tomcat學習總結(9)——Apache Tomcat 8新特性
來頂一下
返回首頁
返回首頁
相關文章
    無相關信息
推薦資訊
如何通過SEO優化排名賺錢?SEO賺錢方法
如何通過SEO優化排名賺
seo優化教程:網站seo內容優化
seo優化教程:網站seo
SEO細節:企業SEO如何快速為新站做出效果
SEO細節:企業SEO如何
電商技術將如何發展?2018年有這五個大膽預測
電商技術將如何發展?
最新文章
欄目更新
欄目熱門
成人黄色