Tomcat結合Apache、Nginx實現高性能的web服務器

1、Tomcat爲何須要與apache、nginx一塊兒結合使用?css

    Tomcat雖然是一個servlet和jsp容器,可是它也是一個輕量級的web服務器。它既能夠處理動態內容,也能夠處理靜態內容。不過,tomcat的最大優點在於處理動態請求,處理靜態內容的能力不如apache和nginx,而且通過測試發現,tomcat在高併發的場景下,其接受的最大併發鏈接數是由限制的,鏈接數過多會致使tomcat處於"僵死"狀態,所以,在這種狀況下,咱們能夠利用nginx的高併發,低消耗的特色與tomcat一塊兒使用。所以,tomcat與nginx、apache結合使用共有以下幾點緣由:html

一、tomcat處理html的能力不如Apache和nginx,tomcat處理靜態內容的速度不如apache和nginx。前端

二、tomcat接受的最大併發數有限,接鏈接數過多,會致使tomcat處於"殭屍"狀態,對後續的鏈接失去響應,須要結合nginx一塊兒使用。java



一般狀況下,tomcat與nginx、Apache結合使用,nginx、apache既能夠提供web服務,也能夠轉發動態請求至tomcat服務器上。但在一個高性能的站點上,一般nginx、apache只提供代理的功能,也就是轉發請求至tomcat服務器上,而對於靜態內容的響應,則由前端負載均衡器來轉發至專門的靜態服務器上進行處理。其架構相似於以下圖:node

wKioL1a0YEmxMZFCAACQJ3DxGcI849.png


在這種架構中,當haproxy或nginx做爲前端代理時,若是是靜態內容,如html、css等內容,則直接交給靜態服務器處理;若是請求的圖片等內容,則直接交給圖片服務器處理;若是請求的是動態內容,則交給tomcat服務器處理,不過在tomcat服務器上,同時運行着nginx服務器,此時的nginx做爲靜態服務器,它不處理靜態請求,它的做用主要是接受請求,並將請求轉發給tomcat服務器的,除此以外,nginx沒有任何做用。linux



2、tomcat的鏈接器協議nginx

tomcat和前端web服務器(nginx或Apache)之間的通訊時靠鏈接器協議來完成的,tomcat共支持4中鏈接器協議,分別爲:web


1) HTTP鏈接器數據庫

2) SSL鏈接器apache

3) AJP 1.3鏈接器

4) proxy鏈接器(好像這個沒用了)


也能夠歸檔爲支持2種鏈接器協議:AJP和HTTP,它們用來在Web服務器和Tomcat之間進行數據傳輸,並提供相應的控制命令。


AJP(Apache JServ Protocol)協議

目前正在使用的AJP協議的版本是經過JK和JK2鏈接器提供支持的AJP13,它基於二進制的格式在Web服務器和Tomcat之間傳輸數據,而此前的版本AJP10和AJP11則使用文本格式傳輸數據。因爲這種協議是二進制的,所以在處理請求時的效率比http協議要高。目前經常使用AJP協議的版本是1.3,它主要有如下特徵:

1) 在快速網絡有着較好的性能表現,支持數據壓縮傳輸;

2) 支持SSL,加密及客戶端證書;

3) 支持Tomcat實例集羣;

4) 支持在apache和tomcat之間的鏈接的重用,不適用於與nginx通訊;



HTTP協議:誠如其名稱所表示,使用HTTP或HTTPS協議在Web服務器和Tomcat之間創建通訊,此時,Tomcat就是一個徹底功能的HTTP服務器,它須要監聽在某端口上以接收來自於前端服務器的請求,對於動態請求須要轉交給servlet容器進行處理。若是前端是nginx作代理的話,那麼nginx和tomcat之間的通訊只能使用http協議了,而不能使用AJP協議。



http鏈接器也有3種類型

Tomcat的HTTP鏈接器有三種:

1) 基於java的HTTP/1.1鏈接器,這也是Tomcat6默認使用的鏈接器,即Coyote;它是Tomcat做爲standalone模式工做時所用到的鏈接器,可直接響應來自用戶瀏覽器的關於JSP、servlet和HTML的請求;此鏈接器是一個Java類,定義在server.xml當中,默認使用8080端口;

2) Java開發的高性能NIO HTTP/1.1鏈接器,它支持非阻塞式IO和Comnet,在基於庫向tomcat發起請求時,此鏈接器表現不俗;但其實現不太成熟,有嚴重bug存在;

3) C/C++開發的native APR HTTP/1.1鏈接器;在負載較大的場景中,此鏈接器能夠提供很是好的性能;APR即Apache Portable Runtime,它是一個能讓開發者採用與平臺無關的風格的方式來開發C/C++代碼本地庫,它可以很好的跨Windows,;

默認tomcat的採用的是第1種鏈接器類型。



實驗前的準備步驟:

1)、因爲我是將tomcat和nginx在不一樣的服務器上配置的,所以,tomcat的ip地址爲192.168.1.103,nginx的ip地址爲172.16.1.100

2)、關閉系統上的防火牆和selinux

3)、nginx系統上的ip地址和網關配置省略了



3、tomcat與nginx一塊兒結合使用

tomcat與nginx爲何須要一塊兒使用的緣由就不在闡述了,前面已經說得很清楚了,這裏直接給出操做步驟。

一、安裝nginx

# yum -y install nginx


二、編輯並配置nginx的配置文件/etc/nginx/nginx.conf

在該配置文件中添加以下配置便可

upstream tomcat {

    server 172.16.1.100 weight=1  max_fails=3 fail_timeout =10s;


location ~*   \.(jsp|do)$ {

            proxy_pass http://tomcat;

}

nginx上只須要添加轉發動態請求的配置便可。


三、啓動nginx服務

# service nginx start



四、安裝配置tomcat

tomcat的安裝這裏就不在詳述了。這裏只給出tomcat的配置

編輯tomcat的配置文件server.xml,添加以下內容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

        <Context docBase="app1" path="a" reloadable="true" />

</Host>


建立相應的目錄及其文件

# mkdir -pv /usr/local/tomcat7/app1/a 

# cd  /usr/local/tomcat7/app1/a 

# vim index.jsp

添加以下測試代碼

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

  <head>

    <title>JSP test page.</title>

  </head>

  <body>

    <% out.println("Hello,world!"); %>

  </body>

</html>

其實整個內容也就是顯示"hello world"。


啓動tomcat

# service tomcat start



五、測試訪問http://192.168.1.103/app1/a/index.jsp

wKiom1a0jwOi5thEAAAeWZOZmj0233.png



4、tomcat結合apache一塊兒使用

apache與tomcat結合使用時,有2種模塊能夠與tomcat進行通訊,這兩種模塊分別是mod_proxy模塊和mod_jk模塊。mod_proxy模塊是apache自帶的模塊,所以要使用該模塊,只須要啓用該模塊就好了。而mod_jk模塊,須要下載並進行手動編譯,使其成爲apache的一個模塊。


mod_proxy模塊能夠基於http協議與tomcat進行通訊,也能夠基於ajp協議與tomcat進行通訊;而mod_jk模塊只能基於ajp協議與tomcat進行通訊。


apache使用mod_proxy模塊與tomcat進行通訊

其步驟以下:

(1)、apache使用mod_proxy模塊與tomcat通訊時,須要加載proxy_module、proxy_http_module、proxy_ajp_module、proxy_balancer_module(負載均衡時須要使用該模塊)等這些模塊。

# yum -y install httpd


查看apache是否已經啓用該模塊了。

# httpd -M | grep proxy

httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

 proxy_module (shared)

 proxy_balancer_module (shared)

 proxy_ftp_module (shared)

 proxy_http_module (shared)

 proxy_ajp_module (shared)

 proxy_connect_module (shared)


(2)、編輯httpd的配置文件/etc/httpd/conf.d/proxy.conf文件,添加以下內容:

proxyvia off

proxypreservehost on

proxyrequests off

proxypass / ajp://172.16.1.100/

proxypa***everse  / ajp://172.16.1.100/

        


若是你的http版本是2.4的話,其配置以下:

proxyvia off

proxypreservehost on

proxyrequests off

<Proxy *>

  Require all granted

</Proxy>

proxypass / ajp://172.16.1.100/

proxypa***everse  / ajp://172.16.1.100/

<Location  / >

  Require all granted

</Location>

                                           

若是要想基於http鏈接器協議與tomcat工做的話,只須要將ajp改成http便可。其餘的配置都不變。   

關於如上apache指令的說明:

ProxyPreserveHost {On|Off}:若是啓用此功能,代理會將用戶請求報文中的Host:行發送給後端的服務器,而再也不使用ProxyPass指定的服務器地址。若是想在反向代理中支持虛擬主機,則須要開啓此項,不然就無需打開此功能。

ProxyVia  {On|Off|Full|Block}:用於控制在http首部是否使用Via:,主要用於在多級代理中控制代理請求的流向。默認爲Off,即不啓用此功能;On表示每一個請求和響應報文均添加Via:;Full表示每一個Via:行都會添加當前apache服務器的版本號信息;Block表示每一個代理請求報文中的Via:都會被移除。

ProxyPa***everse:用於讓apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反向代理環境中必須使用此指令避免重定向報文繞過proxy服務器。

ProxyRequests {On|Off}:是否開啓apache正向代理的功能;啓用此項時爲了代理http協議必須啓用proxy_http_module模塊。同時,若是爲apache設置了ProxyPass,則必須將ProxyRequests設置爲Off。


ProxyPass  [path]  !|url  [key=value key=value ...]]:將後端服務器某URL與當前服務器的某虛擬路徑關聯起來做爲提供服務的路徑,path爲當前服務器上的某虛擬路徑,url爲後端服務器上某URL路徑。使用此指令時必須將ProxyRequests的值設置爲Off。須要注意的是,若是path以「/」結尾,則對應的url也必須以「/」結尾,反之亦然。

另外,mod_proxy模塊在httpd 2.1的版本以後支持與後端服務器的鏈接池功能,鏈接在按需建立在能夠保存至鏈接池中以備進一步使用。鏈接池大小或其它設定能夠經過在ProxyPass中使用key=value的方式定義。經常使用的key以下所示:

◇ min:鏈接池的最小容量,此值與實際鏈接個數無關,僅表示鏈接池最小要初始化的空間大小。

◇ max:鏈接池的最大容量,每一個MPM都有本身獨立的容量;都值與MPM自己有關,如Prefork的老是爲1,而其它的則取決於ThreadsPerChild指令的值。

◇ loadfactor:用於負載均衡集羣配置中,定義對應後端服務器的權重,取值範圍爲1-100。

◇ retry:當apache將請求發送至後端服務器獲得錯誤響應時等待多長時間之後再重試。單位是秒鐘。

                                      

(3)、啓動httpd服務

# service httpd start



(4)、安裝配置tomcat

tomcat的安裝這裏就不在詳述了。這裏只給出tomcat的配置

編輯tomcat的配置文件server.xml,添加以下內容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

        <Context docBase="app1" path="a" reloadable="true" />

</Host>


建立相應的目錄及其文件

# mkdir -pv /usr/local/tomcat7/app1/a 

# cd  /usr/local/tomcat7/app1/a 

# vim index.jsp

添加以下測試代碼

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

  <head>

    <title>JSP test page.</title>

  </head>

  <body>

    <% out.println("Hello,world!"); %>

  </body>

</html>

其實整個內容也就是顯示"hello world"。


啓動tomcat

# service tomcat start


(5)、測試訪問http://192.168.1.103/app1/a/index.jsp

wKiom1a0jwOi5thEAAAeWZOZmj0233.png



apache使用mod_jk模塊與tomcat進行通訊

mod_jk是ASF的一個項目,是一個工做於apache端基於AJP協議與Tomcat通訊的鏈接器,它是apache的一個模塊,是AJP協議的客戶端(服務端是Tomcat的AJP鏈接器)。


(1)、編譯安裝mod_jk

下載地址:http://tomcat.apache.org/connectors-doc/

# yum -y install httpd 

# yum -y install httpd-devel

# tar xf tomcat-connectors-1.2.41-src.tar.gz 

# cd /root/tomcat-connectors-1.2.41-src/native

# ./configure --with-apxs (若是沒有apxs程序,須要安裝httpd-devel包)

# make && make install


(2)、編輯httpd的配置文件/etc/httpd/conf.d/httpd-jk.conf

apache要使用mod_jk鏈接器,須要在啓動時加載此鏈接器模塊。爲了便於管理與mod_jk模塊相關的配置,這裏使用一個專門的配置文件/etc/httpd/conf.d/httpd-jk.conf來保存相關指令及其設置。其內容以下:

LoadModule  jk_module modules/mod_jk.so

JkWorkersFile /etc/httpd/conf.d/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel debug

JkMount /* TomcatA

JkMount /status/ stat1

除了須要使用LoadModule指令在apache中裝載模塊外,mod_jk還須要在apache的主配置文件中設置其它一些指令來配置其工做屬性。如JkWorkersFile則用於指定保存了worker相關工做屬性定義的配置文件,JkLogFile則用於指定mod_jk模塊的日誌文件,JkLogLevel則可用於指定日誌的級別(info, error, debug),此外還可使用JkRequestLogFormat自定義日誌信息格式。而JkMount(格式: JkMount  <URL to match>  <Tomcat worker name>)指定則用於控制URL與Tomcat workers的對應關係。


/etc/httpd/conf.d/workers.properties的內容以下:

worker.list=TomcatA,stat1

worker.TomcatA.port =8009

worker.TomcatA.host=172.16.1.100

worker.TomcatA.type=ajp13

worker.TomcatA.lbfactor=1

worker.stat1.type=status


根據其工做機制的不一樣,worker有多種不一樣的類型,這是須要爲每一個worker定義的一項屬性woker.<work name>.type。常見的類型以下:

◇ ajp13:此類型表示當前worker爲一個運行着的Tomcat實例。

◇ lb:lb即load balancing,專用於負載均衡場景中的woker;此worker並不真正負責處理用戶請求,而是將用戶請求調度給其它類型爲ajp13的worker。

◇status:用戶顯示分佈式環境中各實際worker工做狀態的特殊worker,它不處理任何請求,也不關聯到任何實際工做的worker實例。具體示例如請參見後文中的配置。


worker其它常見的屬性說明:

◇ host:Tomcat 7的worker實例所在的主機;

◇ port:Tomcat 7實例上AJP1.3鏈接器的端口;

◇ connection_pool_minsize:最少要保存在鏈接池中的鏈接的個數;默認爲pool_size/2;

◇ connection_pool_timeout:鏈接池中鏈接的超時時長;

◇ mount:由當前worker提供的context路徑,若是有多個則使用空格格開;此屬性能夠由JkMount指令替代;

◇ retries:錯誤發生時的重試次數;

◇ socket_timeout:mod_jk等待worker響應的時長,默認爲0,即無限等待;

◇ socket_keepalive:是否啓用keep alive的功能,1表示啓用,0表示禁用;

◇ lbfactor:worker的權重,能夠在負載均衡的應用場景中爲worker定義此屬性


(3)、啓動httpd服務

# service httpd start


(4)、安裝配置tomcat

tomcat的安裝這裏就不在詳述了。這裏只給出tomcat的配置

編輯tomcat的配置文件server.xml,添加以下內容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

        <Context docBase="app1" path="a" reloadable="true" />

</Host>


而且將<Engine />這一行改成以下行:

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

這裏的TomcatA要與此前的保持一致。



建立相應的目錄及其文件

# mkdir -pv /usr/local/tomcat7/app1/a 

# cd  /usr/local/tomcat7/app1/a 

# vim index.jsp

添加以下測試代碼

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

  <head>

    <title>JSP test page.</title>

  </head>

  <body>

    <% out.println("Hello,world!"); %>

  </body>

</html>

其實整個內容也就是顯示"hello world"。


啓動tomcat

# service tomcat start


(5)、測試訪問http://192.168.1.103/app1/a/index.jsp

wKiom1a0jwOi5thEAAAeWZOZmj0233.png




5、tomcat的session集羣

對於web服務器集羣技術而言,最重要的環節就是如何保證多個節點間的session信息一致性。要實現這一點,大致有二種方式:

一是將全部的session信息放置在一臺獨立的服務器或者數據庫中,集羣中全部的節點均可以經過這臺服務器獲取其相關數據信息。不過若是這臺服務器掛了的話,那麼全部的節點都不能獲取其session信息了,所以,最好對這臺服務器作高可用。可是這無疑增長了企業的成本。

二是在多臺節點間實現session信息複製,任何一個節點都保存了全部的session數據。只要不是全部的節點都掛掉的話,那麼仍然能夠響應請求,這種方式比較可靠,可是節點之間的相互複製,會增長服務器的負載,而且會增長網絡帶寬。常見的平臺或中間件如microsoft asp.net和IBM WAS都會提供對兩種共享方式的支持,tomcat也是這樣,可是通常採用第二種方式。


tomcat的session集羣架構

實驗前提:

nginx所在服務器地址爲:192.168.1.103

TomcatA所在服務器地址爲:172.16.1.100

TomcatB所在服務器地址爲:172.16.1.200

關閉全部服務器上iptables和selinux



一、實驗拓撲圖以下:

wKiom1a00fTTLBRCAABJkhbTnO0604.png

本實驗中前端採用的是nginx,其實後端tomcat主機上還應該加上apache或nginx的,只不過以前已經將該過程實現了,所以,這裏就不在給出tomcat如何與nginx、apche一塊兒集合使用的步驟了。


二、配置安裝nginx

# yum -y install nginx


編輯nginx的配置文件/etc/nginx/nginx.conf,並添加以下內容:

# vim /etc/nginx/nginx.conf

    upstream tomcat {

        server 172.16.1.100:8080 weight=1 max_fails=3 fail_timeout=10s;

        server 172.16.1.200:8080 weight=1 max_fails=3 fail_timeout=10s;

    }

    server {

        listen 80;

        location / {

                root /htdoc/www;

                index index.html;

        }

         location ~*   \.(jsp|do)$ {

                proxy_pass http://tomcat;

        }

    }


最後,啓動nginx服務

# service  nginx  start


三、配置安裝tomcatA

tomcat和jdk的安裝過程再也不給出,這裏只給出修改配置文件的步驟。

修改tomcat的配置文件server.xml(我這裏的路徑爲/usr/local/tomcat7/conf/server.xml) 

將<Engine>這一行改成以下行:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

其實就是添加了一個jvmRoute參數。


還須要在配置文件中添加一個Host容器

<Host name="node1.xsl.com" appbase="webapps" unpackWARs="true" autoDeploy="true" >

        <Context docBase="node" path="app" reloadable="true" />

</Host>


建立相應的目錄及文件

# mkdir /usr/local/tomcat7/webapps/node/app

# vim /usr/local/tomcat7/webapps/node/app/index.jsp

<%@ page language="java" %>

<html>

  <head><title>TomcatA</title></head>

  <body>

    <h1><font color="red">TomcatA.magedu.com</font></h1>

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

      <tr>

        <td>Session ID</td>

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

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

      </tr>

      <tr>

        <td>Created on</td>

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

     </tr>

    </table>

  </body>

</html>


最後,在啓動tomcat服務便可

# service tomcat start


四、配置安裝tomcatB

tomcat和jdk的安裝過程再也不給出,這裏只給出修改配置文件的步驟。

修改tomcat的配置文件server.xml(我這裏的路徑爲/usr/local/tomcat7/conf/server.xml) 

將<Engine>這一行改成以下行:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

其實就是添加了一個jvmRoute參數。


還須要在配置文件中添加一個Host容器

<Host name="node2.xsl.com" appbase="webapps" unpackWARs="true" autoDeploy="true" >

        <Context docBase="node" path="app" reloadable="true" />

</Host>


建立相應的目錄及文件

# mkdir /usr/local/tomcat7/webapps/node/app

# vim /usr/local/tomcat7/webapps/node/app/index.jsp

<%@ page language="java" %>

<html>

  <head><title>TomcatB</title></head>

  <body>

    <h1><font color="blue">TomcatB.magedu.com</font></h1>

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

      <tr>

        <td>Session ID</td>

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

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

      </tr>

      <tr>

        <td>Created on</td>

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

     </tr>

    </table>

  </body>

</html>


最後,在啓動tomcat服務便可

# service tomcat start


五、測試訪問nginx的負載功能是否成功

訪問http://192.168.1.103/node/app/index.jsp,顯示結果以下:

wKioL1a01YSA5EgpAAArtUn8Dxg615.png


再一次刷新訪問,顯示結果以下:

wKioL1a01ZahJU0_AAAr3Nf5EAw962.png

由此,nginx的負載均衡功能已經實現。注意觀察兩次訪問的結果,其session信息是不相同的,這也就是說其中任何一臺tomcat服務器宕機了,則該服務器上的session信息都會丟失。所以,還須要將session信息保持下來,這裏我採用將兩臺tomcat服務器上的session信息相互進行復制來實現session保持功能。


六、tomcat的session(複製)集羣實現過程

在TomcatA和TomcatB上的server.xml文件中,同時添加以下信息,這段信息添加到<Engine>下面。

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

                 channelSendOptions="8">


          <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"

     //TomcatA        address="172.16.1.100"

     //TomcatB        address="172.16.1.200"

                      port="4000"

                      autoBind="100"

                      selectorTimeout="5000"

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

          </Channel>


          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

                 filter=""/>

          <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>


注意:將TomcatA和TomcatB上的<Receiver >中的address由"auto"改成能夠接受心跳信息的地址。這裏我將TomcatA上的address改成"172.16.1.100";TomcatB上的地址改成"172.16.1.200"。

而後在TomcatA和TomcatB上相應的應用程序目錄(即Context中的docBase目錄)下建立WEB-INF目錄,且建立一個web.xml文件(直接將CATALINA_HOME/conf目錄下的web.xml文件複製過來便可)。

# mkdir /usr/local/tomcat7/webapps/node/WEB-INF

# cp /usr/local/tomcat7/conf/web.xml  /usr/local/tomcat7/webapps/node/WEB-INF

編輯/usr/local/tomcat7/webapps/node/WEB-INF/web.xml文件,添加以下一行信息:

<distributable/>

這行信息添加到<web-app>容器下。


最後,再次訪問http://192.168.1.103/node/app/index.jsp

wKioL1a4m73D55ByAAAqR8xz00A585.png


再次刷新訪問,顯示結果以下:

wKiom1a4m3KD5JDWAAArDMi9Pss286.png


觀察兩次訪問的SESSION ID是同樣的,由此,tomcat的session集羣已經實現了。

相關文章
相關標籤/搜索