Tomcat的基礎知識和一些應用,session cluster和session server

Tomcat簡單來講就是JAVA 2 EE 加上ServletJSP類庫的實現,tomcat=JWSSun+ JservASFcss

Tomcat的核心組件:html

    catalina:servlet container前端

    Coyote:http connectionjava

    Jasper:JSP Engine 執行引擎linux

 

    TomcatInstance: 運行中的tomcat進程(java進程)nginx

        Server:即一個tomcat實例;web

        Service:用於將connector關聯至engine組件;一個service只能包含一個engine組件和一個或多個connector組件;算法

        EngineTomcat的核心組件,用於運行jspservlet代碼;數據庫

        Connector:接入並解析用戶請求,將請求映射爲Engine中運行的代碼;以後,將運行結果構建成響應報文;apache

        Host:相似httpd中的虛擬主機;

        Context:相似於httpd中的alias;

 

    注意:每一個組件都由「類」來實現,有些組件的實現還不止一種;

        頂級類組件:server

        服務類組件:service

        容器類組件:便可以部署webapp的組件,engine,host, context

        鏈接器組件:connector

        被嵌套類組件:valve,logger, realm

  tomcat的主配置文件結構:

    <server>

     <service>

        <connector/>

        <connector/>

        ...

         <engine>

             <host>

               <context/>

              ...

            </host>

            ...

         </engine>

     </service>

    </server>

  Tomcat的目錄結構:

    bin:腳本及啓動時用到的類

    lib:類庫

    conf:配置文件

    logs:日誌文件

    webapps:應用程序默認部署目錄

    work:工做目錄

    temp:臨時文件目錄

  配置文件:

    server.xml:主配置文件

    context.xml:每一個webapp均可以有專用的配置文件,這些配置文件一般位於webapp應用程序目錄下的WEB-INF目錄中,用於定義會話管理器、JDBC等;conf/context.xml是爲各webapp提供默認配置;

    web.xml:每一個webapp「部署」以後才能被訪問;此文件則用於爲全部的webapp提供默認部署相關的配置;

    tomcat-users.xml:用戶認證的帳號和密碼配置文件;

    catalina.policy:當使用-security選項啓動tomcat實例時會讀取此配置文件來實現其安全運行策略;

    catalina.propertiesJava屬性的定義文件,用於設定類加載器路徑等,以及一些JVM性能相關的調優參數;

    logging.properties:日誌相關的配置信息;


CentOS7上默認提供的JDKopenJDK7Tomcat7,這版本已經很新了,能夠直接yum安裝使用

要安裝Tomcat首先要安裝JDK,而後安裝Tomcat,能夠直接yum安裝,也能夠本身下載二進制格式的程序包進行安裝,


下面咱們本身下載二進制程序包進行安裝,下載jdk-8u25-linux-x64.rpmapache-tomcat-8.0.23.tar.gz(如下的演示都是在CentOS7下作的,若是你使用的不是CentOS7可能會有些不一樣)

而後直接rpm -ivh jdk-8u25-linux-x64.rpm 安裝JDK,而後配置環境變量,編輯/etc/profile.d/java.sh文件加入exportJAVA_HOME=/usr/java/latest

export PATH=$JAVA_HOME/bin:$PATH JDK的路徑加入到PATH變量中,使用java回車測試下,看JDK是否安裝成功

wKiom1Y4h5iAFRxPAAA3ExXcFNM687.jpg

wKiom1Y4h7ODPkSnAAFf7VPS8BI448.jpg

若是出現這些信息等,就證實JDK裝好了,環境變量也配置好了

而後安裝tomcattar xf apache-tomcat-8.0.23.tar.gz -C /usr/local

而後切入到/usr/local目錄下,建立一個符號鏈接文件ln -sv apache-tomcat-8.0.23 tomcat

而後切入到tomcat目錄下,不用修改什麼就能夠運行tomcat/usr/local/tomcat/bin/catalina.sh start),但爲了能夠直接使用catalina.shstart運行,須要配置環境變量,編輯/etc/profile.d/tomcat.sh 加入exportCATALINA_HOME=/usr/local/tomcat

export PATH=$CATALINA_HOME/bin:$PATH

wKiom1Y4h9iw8hZeAABH4Ohye3I183.jpg

而後使用catalina.sh start 就能夠啓動了,使用ss –tnl 就能夠發現8080端口啓用了

wKioL1Y4iBaTMIh-AAHugaJNMbs227.jpg

而後訪問測試下

wKiom1Y4h_rREkoWAAPOtvaq1go472.jpg

能夠看到web頁面的管理界面了,裏面的3個按鈕是服務器資源和兩個管理的應用程序

點下Manager這個按鈕須要認證,如今你點擊取消,會提示你在哪修改,而後才能訪問

wKioL1Y4iHmQFEXLAAIMA5J_Pas004.jpg

wKiom1Y4iDzzvwJzAASsMSJrFFY836.jpg編輯配置文件/usr/local/tomcat/conf/tomcat-users.xml,而後加入下面三行就可使用這三個按鈕的功能了

wKiom1Y4iGTSxG4LAABpkt1FwGs388.jpg

wKioL1Y4iKGzfm1QAAKyOKO3nBo469.jpg


Java WebAPP 組織結構:

    有特定的組織形式、層次型的目錄結構;主要包含了servlet代碼文件、JSP頁面文件、類文件、部署描述符文件等;

    例:/usr/local/tomcat/webapps/app1/

        /:webapp的根目錄;

        WEB-INF/:當前webapp的私有資源目錄,一般存放當前webapp自用的web.xml

        META-INF/:當前webapp的私有資源目錄,一般存放當前webapp自用的context.xml

        classes/:webapp的私有類;

        lib/:webapp的私有類,被打包爲jar格式類;

        index.jspwebapp的主頁


  手動添加一個測試應用程序:

    建立webapp特有的目錄結構;

     mkdir-pv myapp/{lib,classes,WEB-INF,META-INF}

wKioL1Y4iQHSZXP8AAAo5H_1QBQ939.jpg

    提供webapp各文件,WEB-INF中應有web.xml文件,META-INF中有context.xml文件,若是沒有的話就會使用conf目錄下默認的這兩個文件;而後直接在myapp目錄下建立一個index.jsp文件,編輯內容以下:

    <%@page language="java" %>

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

    <html>

      <head>

        <title>JSPTest Page</title>

      </head>

        <body>

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

        </body>

    </html>

wKiom1Y4iiGjNYO5AACFPCaLdY8398.jpg

而後canalina.sh stop 等一下子,而後在canalina.sh start;訪問測試下

wKiom1Y4ii7gUMF5AABHSkMP3bg533.jpg

能夠看到沒有問題了

而後這個時候,查看tree /usr/local/tomcat/work

wKioL1Y4in-yU5cTAAA7hDooQkU707.jpg

能夠看到這裏面有.java文件和.class文件,這是JSPindex.jsp經過servlet轉換成.java文件,而後經過complie編譯成bytecodes自解碼的.class文件,而後在JVM中運行

 

部署(deploymentwebapp相關的操做:

    deploy:部署,將webapp的源文件旋轉於目標目錄、配置tomcat服務器可以基於context.xml文件中定義的路徑來訪問此webapp; 將其特有類經過class loader裝載至tomcat

    有兩種方式:

        自動部署:autodeploy

        手動部署:

        1、冷部署:把webapp複製到指定位置,然後才啓動tomcat

        2、熱部署:在不中止tomcat的前提下進行的部分:

           部署工具:managerant腳本、tcdtomcatclient deployer)等;

            undeploy:反部署,中止webapp,並從tomcat實例拆除其部分文件和部署名;

           stop:中止,再也不向用戶提供服務;但其文件和部署名會在tomcat實例中

           start:啓動處於「中止」狀態的webapp

           redeploy:從新部署;

    tomcat自帶的應用程序:

        managerapp: webapp管理工具

        hostmanagerVirtual Hosts管理工具

能夠經過這兩個工具來管理webapp應用程序和虛擬主機,實現應用程序的熱部署等




tomcat啓動是開啓了3個端口一個是8080提供http鏈接器服務的,一個8005是一個管理端口,能夠telnet進入而後關閉服務;還有一個8009端口是提供ajp鏈接器服務的

wKiom1Y4iu3xInlzAAIYUXbINYk272.jpg

 

Tomcat應該考慮工做情形併爲相應情形下的請求分別定義好須要的鏈接器才能正確接收來自於客戶端的請求。一個引擎能夠有一個或多個鏈接器,以適應多種請求方式。

 

定義鏈接器可使用多種屬性,有些屬性也只適用於某特定的鏈接器類型。通常說來,常見於server.xml中的鏈接器類型一般有4種:

    1) HTTP鏈接器

    2) SSL鏈接器

    3) AJP 1.3鏈接器

    4)proxyJK)鏈接器

自定義HostContext示例:

  <Host name="web1.magedu.com"appBase="/data/webapps/"unpackWARs="true"autoDeploy="true">

    <Contextpath="" docBase="ROOT" reloadable="true">

        <ValveclassName="org.apache.catalina.valves.RemoteAddrValve"

                              allow="172\.16\.0\.0"/>

    </Context>

    <Contextpath="/shop" docBase="shopxx" reloadable="true"/>

<Valve className="org.apache.catalina.valves.AccessLogValve"directory="/data/logs" prefix="web1_access_log"suffix=".txt"

pattern="%h %l %u %t &quot;%r&quot; %s %b" />         

 </Host>

      注意:path給定的路徑不能以「/」結尾;

不是默認的Host,本身定義的HostdcoBace儘可能使用絕對路徑,要否則使用相對路徑有時會訪問不到,儘可能使用絕對路徑


下面演示一下:

    修改配置文件(/usr/local/tomcat/conf/server.xml),若是是rpm包安裝的tomcat其配置文件是/etc/tomcat/server.xml

    在Engine段中,加入下面內容

<Host name="centos7"appBase="/data/webapps" autoDeploy="false">

    <Context path="" docBase="/data/webapps"reloadable="true"/>

    <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/data/logs"

              prefix="web1_access_log" suffix=".txt"

               pattern="%h %l %u %t&quot;%r&quot; %s %b" />

  </Host>

wKioL1Y4i-_TfFB8AADiMlEGJCg926.jpg 

建立目錄/data/{webapps,logs}

而後複製咱們之前建立的mydata程序的全部文件複製到/data/webapps

cp  -r/usr/local/tomcat/webapps/myapp/* /data/webapps/

而後修改物理機的hosts文件,讓本機能解析到centos7

而後訪問測試下


這就沒有問題了,本身添加的虛擬主機就生效了

修改配置文件:

wKiom1Y4i9eRhThIAAECksVujVk351.jpg

在裏面定義兩個Centext,一個爲默認的;而後在/data/webapps目錄下的全部文件移動到這個目錄下新建立的ROOT目錄下,而後在新建一個shopxx目錄,而後在shopxx中建立這幾個目錄和一個測試頁classes index.jsp lib META-INF WEB-INF

index.jsp中的內容

wKioL1Y4jGvBVzezAACs9HM92-8692.jpg

首先中止tomcat catalina.sh stop),而後在打開(catalina.sh start

 

wKioL1Y4jJuwV1IoAABJGr-FZbQ430.jpg

wKiom1Y4jF2BoRiAAAAtVFWFPoo909.jpg

能夠看到兩個Context都生效了。path是用來定義訪問時的url的,多個Contextpath不能同樣


而後下載一個軟件shopxx而後解壓到/data/webapps目錄下,把shopxx目錄刪掉,

作一個符號鏈接ln -sv shopxx-v3.0-Beta/shopxx-3.0Beta/ shopxx

配置文件要修改下

wKiom1Y4jJnhyho2AAEGwvaGtVg294.jpg

而後在訪問下

wKioL1Y4jOaiHY_nAAIxQX2d9Ck317.jpg

還須要數據庫,須要安裝mariadb而後開啓,並受權

grant all on shoppxx.* toshopuser@'localhost' identified by 'shoppasswd';

grant all on shoppxx.* toshopuser@'127.0.0.1' identified by 'shoppasswd';

wKioL1Y4jP-TZo_hAADx8H2vA4w102.jpg

而後根據提示,作軟件的安裝

wKiom1Y4jMKhus-aAAHP4EdrVGM533.jpg

wKiom1Y4jOaizw09AADSJoOOCgw956.jpg

這樣就好了

 

 作訪問控制的示例:

    <Context path=""docBase="/data/webapps ">

       <ValveclassName="org.apache.catalina.valves.RemoteAddrValve"

       allow="172\.16\.0\.0"/>

     </Context>

這樣作就好了

而後在咱們作的默認訪問目錄下,建立一個p_w_picpath目錄,而後裏面放兩張圖片,而後關閉tomcat再開啓,而後訪問下,看能正常訪問不

wKioL1Y4jWawTxW9AACM-maSn88440.jpg

 

下面實現LNMT:(Nginx+tomcat

請求的過程 client-->http --> nginx --> reverse_proxy --> http --> tomcat (httpconnector)      

首先找一臺主機,安裝nginx,而後配置nginx

wKiom1Y4jw-Q_wgnAAA11zScZHo205.jpg

而後啓動服務就好了,訪問測試下

wKiom1Y4j73zZVwpAAEU6mALsYM964.jpg

這就代理過去了,可以訪問了,但訪問的不是咱們想要的虛擬主機,

這是基於IP地址訪問的,若是tomcatEngine中的默認虛擬主機不是咱們須要的話,咱們就要以主機名來訪問了,或者修改Tomcat的配置文件,把默認虛擬主機改成咱們須要的

修改/etc/nginx/nginx.conf

wKioL1Y4kJvAbhcNAAAn_-BgMZ0244.jpg

而後修改/etc/hosts文件增長一條172.16.249.195  centos7

而後重載nginx

這樣就能夠經過反代來訪問咱們須要訪問放到的虛擬主機

wKioL1Y4joHDlKfuAABg7PTxUBQ853.jpg

 

若是須要把靜態的讓nginx響應,讓動態的轉交給後端的tomcat

修改nginx的配置文件

wKioL1Y4jcShUxpwAAA5EK643X0879.jpg

而後重載nginx,訪問測試

這個時候默認請求的是index.html,因此沒有轉交給tomcat,而是nginx本身響應了

wKiom1Y4kIOivbhtAAJPns7kC1I534.jpg

後面帶上指定的url訪問

wKiom1Y4kIuCoIDSAAA-5nJlZ-Y905.jpg

能夠看到實現動靜分離了

 

實現LAMT(apache+tomcat)

  訪問請求 client--> http --> httpd --> reverse_proxy --> {http|ajp} --> tomcat{http connector|ajp connector}

把剛在主機(172.16.249.159nginx停掉,而後打開httpd服務

而後用httpd來進行反向代理

反代模塊:

    主:proxy_module

    子:proxy_module_http,proxy_module_ajp

      還可使用第三方的模塊jk來進行反代

 

首先打開/etc/httpd/conf/httpd.conf註釋掉主節點即DocumentRoot這一行

在這個/etc/httpd/conf.d目錄下,建立一個虛擬主機的配置文件vhosts.conf文件

而後添加內容:

wKiom1Y4kWGiRBCjAADPOIxL2rA659.jpg

<Location />定義的是訪問的全部url都代理容許經過

ProxyRequests Off 這一項是關閉正向代理的,由於httpd中的代理是正反向均可以代理,但只能×××一種,因此要明確使用哪種代理

 

而後使用httpd –t檢查語法,而後在啓動httpd

wKiom1Y4kYKCrIFyAADJNURVfY0433.jpg

這有一個警告,須要修改httpd主配置文件,給一個主機名

找到ServerName,而後修改

wKiom1Y4kZKiSvpuAAErhcjnOBk197.jpg

而後啓動httpd服務,

修改物理機的hosts文件 172.16.249.159  centos7

而後訪問測試下

wKioL1Y4keGAwpZkAAAmEOEaFLg495.jpg

能夠看到調度到後端的tomcatcentos7虛擬主機上了(ProxyPreserveHost On由於這一項是,保留本身請求的虛擬主機到後端去)

若是使用的是ip地址訪問是不會把主機名加上的因此請求的是

wKiom1Y4kb6g5SiXAAJxQQhIAoc596.jpg

下面作幾個實例,實現負載均衡和會話綁定,以及session cluster和session server

示例:nginx, apache(mod_proxy_http,mod_proxy_ajp, mod_jk)負載均衡用戶請求至tomcat;額外實現session sticky

下面的示例使用的是CentOS7下yum安裝的JDK和Tomcat


172.16.249.159centos72)作負載均衡器,172.16.249.115centos71)和172.16.249.112centos73)作後端的tomcat

首先配置tomcat,使用java  -version,看到系統自帶的有JDK1.7,因此這裏不在本身編譯安裝,直接yum安裝,而後安裝tomcatyum  install  tomcat

而後使用rpm  -qpl  tomcat

能夠看到,tomcat的配置文件在/etc/tomcat/server.xml

啓動tomcat直接使用systemctl  start  tomcat.service

而後訪問測試下,看能訪問到主頁不

wKioL1Y4k2iAUSQzAAIU4XQ1Qms449.jpg

wKiom1Y4kzzAbOCuAALThV3igLE273.jpg

 

爲了之後配置方便,而後再給tomcat配置一個Host,首先建立目錄mkdir -pv /data/webapps/ROOT/data/webapps這個目錄的屬組改成tomcat),mkdir/data/logs,而後編輯tomcat的配置文件(/etc/tomcat/server.xml

wKioL1Y4k5OSsq4SAACHf1OpNQQ506.jpg

修改配置文件,添加下面這些

wKiom1Y4k2Sgx9AoAADWNRcp06s711.jpg

而後在/data/webapps/ROOT/目錄下,建立幾個目錄和一個index.jsp文件,提供測試頁

mkdir lib classes META-INF WEB-INFvimindex.jsp

wKioL1Y4k7LinmW6AACVXBcDmEg695.jpg

而後另外一個tomcat節點,也作上面的這些配置,知識測試頁爲「Hello  Worderon web2

能夠直接複製過去scp server.xml centos73:/etc/tomcat/,而後修改

wKiom1Y4k43Rs00IAADTOwYHK_w076.jpg

scp -rp /data/ centos73:/data,而後修改index.jsp

 

而後重啓tomcat systemctl  restart  tomcat.service

在其餘虛擬機中測試下,首先查看這個虛擬機中可否解析主機名centos71,要是用物理機測試,須要在hosts文件中加入 172.16.249.115  centos71  172.16.249.112  centos73wKiom1Y4k6eDtOrTAAFi57WRdqU486.jpg

wKioL1Y4lDyQzG6VAAA0OMECcG4041.jpg

wKiom1Y4k__gC03ZAACO6oQBYro590.jpg

wKioL1Y4lDyiXqY7AAAvA7qoTvw991.jpg

這樣tomcat就作好了,測試也沒問題了,

 

由於tomcat中的默認主機不是咱們剛配置的,只能使用主機名才能訪問,那麼負載均衡器中就要能解析到後端的tomcat主機的主機名,爲了方便,咱們能夠把tomcat的默認主機改成咱們配置的虛擬主機(Host

wKiom1Y4lECxuJxYAABdFUV8AOU461.jpg

wKioL1Y4lH3yWY-HAAAzA4gFlc4746.jpg

在重啓一下,使用ip地址訪問測試下

wKioL1Y4lKLhjbalAAA36TrpDLI570.jpg

wKiom1Y4lGWQ6nDyAAA-4R9V_d4217.jpg 

 

下面作負載均衡:

一、  使用nginx作負載均衡器,反向代理

172.16.249.159上安裝nginx

而後修改nginx的配置文件(/etc/nginx/nginx.conf

wKioL1Y4lMCRJhPXAAEyrqPySck099.jpg

而後使用nginx  – t 檢查語法,而後啓動nginx

wKiom1Y4lKSTP15eAACmw4ugaEE992.jpg

而後訪問測試下

wKioL1Y4lOHhr0Q7AABEH6wFy6E275.jpg

刷新下,

wKiom1Y4lKSQMT2dAABBljSXjN8863.jpg

能夠看到能負載均衡了,這樣nginx負載均衡tomcat就作好了

若是要作會話綁定(session  sticky),只須要在nginx配置文件中修改

wKiom1Y4lKSjLcbFAABI8ZSno3M499.jpg

而後systemctl  reload  nginx.service,而後訪問測試

wKioL1Y4lRSyAZxMAABDmJ4tQPE802.jpg

不管怎麼刷新都是這一個頁面不變了

 

 

二、  使用apache來作負載均衡器和反向代理,可使用3種模塊來負載均衡tomcat

首先停掉nginx服務systemctl  stop  nginx.service,而後安裝httpd

  (a)   mod_proxymod_proxy_httpmod_proxy_balancer

編輯httpd配置文件,首先進入httpd的主配置文件(/etc/httpd/conf/httpd.conf)把中心主機禁掉(這一行註釋掉DocumentRoot "/var/www/html"),而後在/etc/httpd/conf.d/目錄下,建立一個vhosts.conf文件,內容以下:

<proxy balancer://lbcluster1>

  BalancerMemberhttp://172.16.249.115:8080 loadfactor=1 route=TomcatA

  BalancerMemberhttp://172.16.249.112:8080 loadfactor=1 route=TomcatB

</proxy>

<VirtualHost *:80>

    ServerName centos7

    ProxyVia On

    ProxyRequests Off

    ProxyPreserveHost On

    <Proxy *>

        Require all granted

    </Proxy>

    ProxyPass /balancer://lbcluster1/

    ProxyPa***everse /balancer://lbcluster1/

    <Location />

        Require all granted

    </Location>

</VirtualHost>

wKiom1Y4lSKwOTauAAFOoc7l8ys937.jpg

而後使用httpd  -t 檢查語法,而後打開httpd服務

wKioL1Y4lXjQnJp6AABV4cWi37M106.jpg

 

須要修改後端tomcat的配置文件(/etc/tomcat/server.xml

172.16.249.115上的改成:

wKiom1Y4lYnxu9WmAABCyewGLDY011.jpg

172.16.249.112上的改成:

wKiom1Y4laODQsyIAABSFrXhFXM210.jpg

爲了演示效果修改測試頁面:

TomcatA上(/data/webapps/ROOT/index.jsp)提供以下頁面

<%@ page language="java" %>

<html>

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

  <body>

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

    <tablealign="centre" border="1">

      <tr>

        <td>SessionID</td>

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

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

      </tr>

      <tr>

        <td>Createdon</td>

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

     </tr>

    </table>

  </body>

</html>

 

 

TomcatB上(/data/webapps/ROOT/index.jsp)提供以下頁面

<%@ page language="java" %>

<html>

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

  <body>

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

    <tablealign="centre" border="1">

      <tr>

        <td>SessionID</td>

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

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

      </tr>

      <tr>

        <td>Createdon</td>

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

     </tr>

    </table>

  </body>

</html>

而後後端tomcat重啓(systemctlrestart tomcat.service

 

而後訪問測試:

wKioL1Y4ljmyI8blAAC0Er4cS9Q572.jpg

wKiom1Y4lfvT7ks5AADG_9ukZF8454.jpg

能夠看到能負載均衡了,但每一次刷新後session  ID都不同

 

下面作會話綁定(sessionsticky),

修改vhosts.conf文件:

wKioL1Y4llOBLuGIAAEX31YxJM8634.jpg

而後檢查語法,重載httpd服務,而後測試下

wKiom1Y4liXyhmJoAADNWM4rrE8427.jpg

而後不管怎樣刷新,都不會變了,這樣會話綁定(session sticky)就作好了

  (b) mod_proxymod_proxy_ajpmod_proxy_balancer

首先把vhosts.conf 重命名爲vhosts.httpd.conf.bak,而後複製vhosts.httpd.conf.bakvhosts.ajp.conf,而後修改vhosts.ajp.conf配置文件:

wKioL1Y4lnywHPLhAAG4ierXVrk180.jpg

而後保存退出,檢查語法,重啓httpd服務,進行測試

wKioL1Y4lqShY8o_AADEP34qo3M462.jpg

wKiom1Y4lmfhfFWHAACzOqQ4Qlc620.jpg

而後作會話綁定(sessionsticky

只須要在裏面加入下面一行

wKioL1Y4lrLykUQXAADDXr8FX7w965.jpg

而後重載服務,進行測試

wKiom1Y4ln6wzI1ZAADC9mH45C4605.jpg

而後刷新頁面就不會變了


(c) mod_jk

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

要使用這個模塊,須要編譯這個模塊,還要安裝httpd的開發包,httpd-devel  gcc glibc-devel yum -y installhttpd-devel gcc glibc-devel),安裝開發包組,首先yum grouplist,而後在可用組裏找到「開發工具」,而後安裝(yum groupinstall "開發工具"),若是已經安裝過就不用安裝了

下載tomcat-connectors-1.2.40-src.tar.gz

而後解壓,編譯安裝,使用whichapxs,由於編譯安裝時必須指apxs的安裝路徑

wKiom1Y4lvyQhdpjAAGDhyl60pQ535.jpg

回車,編譯,而後make  && make  install

wKiom1Y4lxzy7uvjAAFvXX3qUCY187.jpg

wKioL1Y4l1nxoHSiAAHGSwClNio565.jpg

看到這個模塊生成就能夠了

而後在/etc/httpd/conf.d/目錄下,建立一個mod_jk.conf的文件,編輯內容以下:

wKiom1Y4lzehwPZXAACV26tzNMk202.jpg

而後在/etc/httpd/conf.d/目錄下,建立一個workers.properties文件,編輯內容以下:

wKioL1Y4l3XCVfDsAAEfdILWX_8028.jpg

而後保存,檢查語法,重啓httpd服務,而後測試

wKiom1Y4l2Lir4BcAADIeK0GUw4867.jpg

wKioL1Y4l5_QDqSqAADLOfjzN_I031.jpg

這樣負載均衡就作好了,

而後作作會話綁定(sessionsticky),須要修改workers.properties文件

wKiom1Y4l3DACIPjAAB1G5NuzGo781.jpg

而後重啓服務,進行測試

wKioL1Y4l7vQai2TAADAJOxfgV4456.jpg

而後怎樣刷新都不會改變了,這樣會話綁定就作好了


示例:構建session  cluster,實現不論基於什麼調度算法,會話的信息再也不變化,即sessionID再也不變化,

tomcat中自帶會話管理器(session  manager

    StandardManager:標準會話管理器

    PersistentManager:持久會話管理器

        FileStore

        JDBC

           DeltaManager

         BackupManager

前端(172.16.249.159)使用的爲http協議作反代的(2(a)這個示例),


構建步驟:

(1)    tomcat節點配置使用deltamaanager:在<Engine><Host>字段中,加入下面內容

咱們在本身定義的Host中複製下面這些內容到tomcat配置文件中,(這些內容在http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html中)

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

    channelSendOptions="8"> 

<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"

    expireSessionsOnShutdown="false"

    notifyListenersOnReplication="true"/>

 <ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">           <MembershipclassName="org.apache.catalina.tribes.membership.McastService"

    address="228.0.1.7"

    port="45564"

    frequency="500"

    dropTime="3000"/>           <ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"

    address="auto"

    port="4000"

    autoBind="100"

    selectorTimeout="5000"

    maxThreads="6"/>         <SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">             <TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

            </Sender>            <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>          <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

          </Channel>

        <ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"

                 filter=""/>       <ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"

    tempDir="/tmp/war-temp/"

    deployDir="/tmp/war-deploy/"

    watchDir="/tmp/war-listen/"

    watchEnabled="false"/>

<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>

    </Cluster>

停掉tomcat服務,而後複製上面內容,修改以下,

wKiom1Y4mH_hzX_UAAOhyDW2tFA719.jpg

另外一個節點一樣停掉tomcat服務,複製上面內容,並修改下

wKioL1Y4mMWTb-bSAAOUGmQ-UDc307.jpg

   (2) 爲須要使用session clusterwebapps開啓sessiondistribution的功能:

       WEB-INF/web.xml中添加

            <distributable/>

     複製/etc/tomcat/目錄下的web.xml/data/webapps/ROOT/WEB-INF/目錄下,而後修改web.xml,在最後這個</web-app>前加入<distributable/>,另外一個節點作一樣的操做

wKiom1Y4mLTSczKpAACN_DG4kCY994.jpg

複製這個文件到另外一個節點上

scp  /data/webapps/ROOT/WEB-INF/web.xml172.16.249.112:/data/webapps/ROOT/WEB-INF/

而後啓動tomcat

訪問測試

wKioL1Y4mQ2TyuLYAADRUjuDZHk185.jpg

wKiom1Y4mNDT6iUSAACw9i8Bf4g505.jpg

能夠看到Session  ID沒有變,能夠看到作成功了

這樣session  cluster就作好了

 

而後修改前端(172.16.249.159)的,修改代理的模式,使用ajpmod_jk模式,均可以實現,會話綁定,前端使用nginx作代理,也能夠實現會話綁定,這裏就再也不演示了(注意:使用其餘模式時,記得把剛作的會話綁定要去掉)

由於這是tomcatsession  cluster 跟前端的負載均衡器沒有關係,

 

   示例:構建session  server


須要使用memcached,下面介紹下memcache的一些知識

    memcached的特色:

       協議簡單

       基於libevent事件處理

       基於內存完成數據存儲:LRU

       memcached互不通訊的集羣:分佈式

首先要安裝memcachedyum installmemcached

經過配置/etc/sysconfig/memcached這個文件,來對memcached傳遞一些參數,若是要編輯memcached的一些特性,就須要編輯這個文件(/etc/sysconfig/memcached

直接啓動(systemctl startmemcached.service)就能夠了,監聽在tcpudp11211端口上

wKiom1Y4mWHiQMm-AALnDSvkFqI075.jpg

memcached是旁掛式緩存:

    一半在客戶端;一半在服務端

wKioL1Y4mbWhn6-jAAET4Ptr_00898.jpg

memcached在內存中的存儲方式:

slab allocation機制:整理內存以進行復用

     Page: 分配給slab用於再次分割爲chunk的內存空間;

     chunk:用於緩存緩存對象的空間;

slab class:特定大小的chunk組合而成的組;

  memcached還自帶一個狀態查看與管理工具: /usr/bin/memcached-tool,能夠查看如今memcache中的狀態信息

wKioL1Y4mduTuYVIAACAe6sJIpE722.jpg

這些字段的含義:

#slab class的編號;

    Item_sizeChunk大小;

    Max_age:緩存對象的生存時間;

    Pages:分配給slab內存頁數;

    Countslab內的記錄數;

    Full?slab內是否仍有空閒chunk


下面用實例實現讓tomcat的會話信息保存在memcache中,實現session  server


memcached-session-manager項目地址:

http://code.google.com/p/memcached-session-manager/

下載以下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,其中的${version}要換成你所須要的版本號,tc${6,7,8}要換成與tomcat版本相同的版本號。(看本身使用的tomcat是什麼版本,就下載什麼版本)

         memcached-session-manager-${version}.jar

         memcached-session-manager-tc${6,7,8}-${version}.jar

         spymemcached-${version}.jar

         msm-javolution-serializer-${version}.jar

         javolution-${version}.jar

後端tomcat節點上,作以下操做:

把這些文件下載到這個目錄下/usr/share/tomcat/lib/

wKiom1Y4mh2B7a0wAAIWnHmw38s213.jpg

把剛纔咱們在tomcat配置文件中加入的<Cluster></Cluster>這一段裏面的內容刪掉,而後分別在兩個tomcat上的咱們本身定義的Host上定義一個用於測試的context容器,並在其中建立一個會話管理器,以下所示:

                        <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"              memcachedNodes="n1:172.16.249.159:11211,n2:172.16.249.112:11211"         failoverNodes="n1"

    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

    />

 

兩個節點都作這樣的操做

wKioL1Y4mtvTAtCPAAHPya6oMEw736.jpg

而後還要把tomcat配置文件中的,Engine字段裏的jvmRoute去掉

wKiom1Y4mrzQjaGjAAA6RwMsSds841.jpg

另外一個節點的tomcat配置文件中的,Engine字段裏的jvmRoute去掉

memcachedNodes寫入的是開啓memcached服務的主機的地址,一個是172.16.249.159  172.16.249.112 memcached不須要作修改,直接安裝而後啓動就好了

而後把咱們在/data/webapps/ROOT/WEB-INF/目錄中的web.xml文件刪掉,兩個節點

而後從新啓動tomcat服務,

訪問測試

wKioL1Y4mzqxQqKMAACyqbUF1Uk920.jpg

wKiom1Y4mv2CDq5_AACfIhKpsoc262.jpg

能夠看到,負載均衡了,session  ID也沒有變

這樣使用memcachedsession  server 就作好了

相關文章
相關標籤/搜索