Tomcat簡單的來講相似於php的功能,主要實現java程序的編譯,最後呈現給用戶的是html格式的代碼,使用用戶能夠在瀏覽器中訪問。Tomcat是Java語言研發的,因此依賴於java的虛擬機(jvm)。php
實現的原理以下圖,會話保持使用前端的調度器實現。例如:使用Ngnix調度時,使用ip_hash算法就能夠實現。css
操做系統: CentOS 6,5 目標主機:172.16.10.122 172.10.10.133 第一步:安裝Java虛擬機 ### 得到jdk軟件 jdk-6u31-linux-x64-rpm.bin 這裏說明:對應的jdk版本有bin版本和rpm版本, 能夠根據本身的須要下載。下載地址是: ### 安裝步驟 chmod +x jdk-6u31-linux-x64-rpm.bin ./jdk-6u31-linux-x64-rpm.bin ## cat /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=/usr/java/latest/bin/:$PATH ### source /etc/profile.d/java.sh 第二步:安裝tomcat ### 得到tomcat軟件 apache-tomcat-7.0.55.tar.gz ### 安裝步驟 tar xf ache-tomcat-7.0.55.tar.gz -C /usr/local ln -sv apache-tomcat-7.0.55 tomcat ### cat /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH ### 第三步:添加測試站點,站點的目錄數以下: ### tree /usr/local/tomcat/webapps/test/ /usr/local/tomcat/webapps/test/ |-- WEB-INF | |-- classes | `-- lib `-- index.jsp 3 directories, 1 file # 3個目錄WEB-INF classes lib 1個文件 # 文件內容:172.16.10.122 <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.example.com</h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("example.com","example.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> # 文件內容:172.16.10.133 <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.example.com</h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("example.com","example.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> 第四步:啓動tomcat catalina.sh start
操做系統: CentOS 6,5 目標主機:172.16.10.1 第一步:安裝Ngnix ### 能夠使用源碼編譯安裝,也可以使用rpm方式安裝(需配置好epel源)這裏使用 rpm方式安裝。 yum install ngnix -y 第二步:配置Ngnix前端調度 ### cat /etc/nginx/conf.d/default.conf 主要配置以下: upstream www.tomcat.org { ip_hash; server 172.16.10.122:8080; server 172.16.10.133:8080; } server { listen 80; server_name www.tomcat.org; location / { proxy_pass http://www.tomcat.org; index index.jsp index.html index.htm; } }
這是經過ip_hash調度方法實現的。思考以下問題:這樣作還能減輕後端tomcat的壓力嗎??html
解決辦法:將session信息在每一個Tomcat節點上保存一份,作成tomcat集羣(session集羣)。前端
實現架構不變。java
### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>內部如下內容添加: 目標主機:172.16.10.122 172.16.10.133 <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.10.10.14" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="172.16.10.122/172.16.10.133" # 注意此選項默認是auto,這裏須要配置。每一個節點配置本身的ip地址, # 意思是接收session心跳消息的地址 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> ### 在相應應用程序的web.xml中添加<distributable\>; 也能夠全局添加 目標主機:172.16.10.122 172.16.10.133 cp /usr/local/tomcat/webapps/test/WEB-INF/web.xml /usr/local/tomcat/webapps/test/WEB-INF/ # 編輯 /usr/local/tomcat/webapps/test/WEB-INF/web.xml 在 <web-app> 中添加: <distributable/>;
這裏主要是使用輪詢調度,不使用ip_hash調度。只需將配置文件中的ip_hash去掉便可。mysql
配置完成後,重啓tomcat便可。linux
從結果中能夠知道,實現了session保持。nginx
思考以下問題? 這種方式的session保持是經過每一個節點保存一份session信息,可是:但集羣節點不少時,這些seesion信息多是很大級別的。此時,各個節點之間的session複製反而成了影響系統性能的瓶頸。web
解決辦法: 使用session服務器,將seession信息統一保存到緩存服務器中。算法
試驗拓撲圖以下:
tomcat實現此功能要藉助於msm(Memcached-Session-Management)模塊能夠實現。須要下載jar包, javolution、memcached-session-manager-tc七、spymemcached、memcached-session-manager、msm-javolution-serializer 。將這些jar包拷貝到/usr/local/tomcat/lib/目錄下,支持msm功能。這些包能夠再Google Code中找到。
下載時要注意:要與tomcat的版本相對應。
操做系統:CentOS 6.5 目標主機:172.16.10.1 172.16.10.9 yum install memcached -y service memcached start
目標主機:172.16.10.122 172.16.10.133 ## 在試驗一的基礎上,繼續配置 ### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>內部如下內容添加: <Context path="/test" docBase="/usr/local/tomcat/webapps/test/" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.16.10.9:11211,n2:172.16.10.1:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context>
結果示例:
對於前端調度器也可以使用apache和haproxy反向代理器。
tomcat + memcacahed + nginx + mysql + nfs 實現jsp格式的論壇。試驗拓撲圖以下:
#### 配置 NFS 服務器 mkdir /tomcatdata # 編輯 /etc/exports,添加: /tomcatdata 172.16.0.0/16(rw) service nfs start ### 配置 mysql yum install mysql-server -y servive mysqld start mysql> CREATE DATABASE jcenter1; mysql> GRANT ALL ON jcenter1.* TO jcenter@'172.16.%.%' IDENTIFIED BY 'jcenter'; mysql> FLUSH PRIVILEGES;
目標主機: 172.16.10.122 172.16.10.133 第一步:搭建站點 mkdir /tomcat/webapps/ mount -t nfs 172.16.10.1:/tomcatdata /tomcat/webapps/ # 獲取jsp程序 JavaCenter_Home_2.0_GBK.tar.bz2 java程序代碼 tar -xf JavaCenter_Home_2.0_GBK.tar.bz2 -C /tomcat/webapps/ cd /tomcat/webapps/ ln -sv JavaCenter_Home_2.0_GBK jct # 配置 JavaCenter:/tomcatdata/jct/config.properties # 主要修改如下: # 數據庫服務器地址(通常爲本地localhost或127.0.0.1) dbHost = 172.16.10.1 # 數據庫服務器端口號(通常爲3306) dbPort = 3306 # 數據庫用戶名 dbUser = jcenter # 數據庫密碼 dbPw = jcenter # 數據庫名 dbName = jcenter1 第二步:配置tomcat <Host name="www.tomcat.org" appBase="/tomcat/webapps" unpackWARs="true" autoDeploy="true"> <Context path="/jct" docBase="jct" /> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.16.10.9:11211,n2:172.16.10.1:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> </Host> # 固然msm所依賴的jar包要拷貝到對應的目錄下 從新啓動tomcat.
至此,配置基本完成。