标签:tomcat session cluster memcached apache反代tomcat
一、 Java技术体系及Tomcat结构编程语言:
系统级:C,C++,go,erlang
应用级:C#,java,python,perl,ruby,php
虚拟机:jvm,pvm
动态网站:asp .net jsp
动态网站:
客户端动态
服务器动态:
CGI
webapp server:
jsp:tomcat,jboss,jetty
php:php-fpm
Java编程语言:
SUN, James Gosling, Green Project, Oak, Java, SunWorld
1995: Java 1.0, Write Once, Run Anywhere
1996: JDK (Java Development Kit),包含一个JVM(Sun Classic VM)
JDK 1.0: JVM, Applet, AWT
1997:JDK 1.1
JAR文档格式、JDBC、JavaBeans
1998:JDK 1.2
Sun把Java技术分拆为三个方向:Java 2
J2SE: Standard Edition
J2EE:Enterprise Edition
J2ME:Mobile Edition
代表性技术:EJB, Java Plug-in, Swing,
JIT编译器: Just In Time,即时编译器
2000:JDK 1.3
1999:HotSpot虚拟机
2002:JDK 1.4
2006年,Sun开源了Java技术;遵循GPL规范;并建立了OpenJDK组织管理此些代码;
虚拟机:JRockit, HostSpot;
编程语言的类别:指令+数据
面向过程:以指令为中心,围绕指令组织数据;
面向对象:以数据为中心,围绕数据组织指令;
Java体系结构:
Java编程语言;
Java Class文件格式;
Java API;
Java VM
Java编程语言的特性;
面向对象、多线程、结构化错误处理;
垃圾收集、动态链接、动态扩展
三个技术流派
J2SE ==> Java 2 SE
J2EE ==> Java 2 EE
J2ME ==> Java 2 ME
JVM运行时区域:运行为多个线程
方法区:线程共享;用于存储被虚拟加载的类信息、常量、静态变量等;永久代
堆:java堆是jvm所管理的内存中最大的一部分;也是GC管理的主要区域,主流的算法都基于分代收集方式进行;新生代和老年代;线程共享
Java栈:线程私有,存放线程自己的局部变量等信息;
PC寄存器(Program Counter Register),线程独占的内存空间;本地方法栈;
JAVA 2 EE:
JAVA 2 SE
Servlet, JSP, EJB, JMS, JMX, JavaMail
Servlet Contaier:容器
println("<h1>")
html标签要硬编码在应用程序中;
JSP:
<html>
<body>
<h1>...</h1>
<%
%>
</body>
</html>
Web Container:
JDK, Servlet, JSP
商业实现:
WebSphere(IBM)
WebLogic (BEA --> Oracle)
Oc4j
Glassfish
Geronimo
JOnAS
JBoss
开源实现:
Tomcat
jetty
resin
二、 Tomcat
Tomcat的核心组件:
Catalina:servlet container
Coyote:http connection
Jasper:JSP Engine
Tomcat的开发语言:JAVA
Tomcat Instance:运行中的tomcat进程(java进程)
Server:即一个tomcat实例;
Service:用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;
Engine:Tomcat的核心组件,用于运行jsp或servlet代码;
Connector:接入并解析用户请求,将请求映射为Engine中运行代码;之后,将运行结果构建成响应报文;
Host:类似httpd中的虚拟主机;
Context:类似于httpd中的alias;
Note:每个组件都由“类”来实现,有些组件的实现还不止一种;
顶级类组件:server
服务类组件:service
容器类组件:即可以部署webapp的组件,engine,host,context
连接器组件:connector
被嵌套类组件:valve,logger,realm
格式:
<server>
<service>
<connector />
<connector />
...
<engine>
<host>
<context />
...
</host>
...
</engine>
</service>
</server>
Tomcat的运行模式:
Standalone:通过内置的web server(http connector)来接收客户端请求;
Proxy:由专门的web server服务客户端的http请求;
in-process:部署于统一主机
network:部署于不同主机;
安装Tomcat
Centos6:
Oracle JDK,Tomcat
Yum repo:
Jdk
Tomcat6
Tomcat
Centos7:
OpenJDK 7
Tomcat 7
Jdk 1.6 ,1.7,1.8
1. 首先安装JVM,官网下载安装jdk程序包,并安装;
2. 安装后生成的目录文件在/usr/java目录下;
3. 配置JAVA_HOME环境变量,指向java的安装路径;
重读脚本那文件并测试:
4. 解压缩tomcat二进制程序包,解压到/usr/local/目录下,并创建软连接;
5. 添加环境变量并重读配置文件;
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.properties:java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;
logging.properties:日志相关的配置信息;
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.jsp:webapp的主页
webapp归档格式:
.war:webapp
.jar:EJB的类;
.rar:资源适配器;
.ear:企业级应用程序;
演示:手动添加一个测试应用程序;
1. 创建webapp特有的目录结构;
2. 提供webapp文件;
3. 启动tomcat服务并查看端口;(8080和8009端口)
4. 访问测试
5. 查看work目录可查看工作过程;
部署(deployment)webapp相关操作:
deploy:部署,将webapp的源文件旋转于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp;
将其特有类通过class loader装载至tomcat;
有两种方式:
自动部署:auto deploy
手动部署:
1. 冷部署:把webapp复制到指定位置,而后才启动tomcat;
2. 热部署:在不停止tomcat的前提下进行的部分;
部署工具:manager、ant脚本、tcd(tomcat client deployer)等;
udeploy:反部署,停止webapp,并从tomcat实例拆除其部分文件和部署名;
stop:停止,不再向用户提供服务;
start:启动处于“停止”状态的webapp;
redeploy:重新部署;
tomcat自带的应用程序:
manager app:webapp工具;
host manager:Virtual Hosts管理工具;
演示:
1. 登录tomcat主访问页面,点击manager app;
2. 跳出以下内容;
3. 根据以上的提示方式,操作;
1) 首先添加context;
2) 在/usr/local/tomcat/conf/tomcat-users.xml文件中添加用户;
4. 冷部署,停止tomcat服务后再重启;
5. 浏览器再次访问就能登入管理界面;
可在此界面进行管理等操作;
6. 继续修改配置文件$tomcat_home/webapps/host-manager/META-INF/context.xml;否则会出现可以访问manager app不能访问host manager的情况;
7. 重启服务后,测试访问;
Server.xml文件详解:
server.xml文件中可定义的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。
下面简单介绍几个常用组件;
1. server组件;
即tomcat启动一个server实例(JVM),它监听在8005端口以接收shoudown命令。各server的定义不能使用同一个端口;这个端口的定义用于为管理员提供一个关闭此实例的编辑途径,因此,管理员可以直接telnet至此端口使用shutdown命令福安比实例。不过基于安全考虑,通常不被允许远程进行;
Server相关属性:
ClassName:用于实现此server容易的完全限定类的名称,默认为rg.apache.catalina.core.StandardServer;
Port:接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
Shutdown:发往此server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
2. service组件;
Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。
Service相关属性:
ClassName:用于实现service的类名,一般都是rg.apache.catalina.core.StandardService。
Name:此服务的名称,默认为Catalina;
3. connector组件;
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有3种:
1) HTTP连接器
2) SSL连接器
3) AJP1.3连接器
Connector相关属性:
address:指定连接器的监听地址,默认为所有地址,即0.0.0.0
maxThreads:支持的最大并发连接数,默认为200;
port:监听的端口,默认为0;
protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3
redirectPort:如果某连接器支持的协议时HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true;
acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
4. Engine组件:
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。
相关属性:
DefaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非明确定义的虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机名称中至少要有一个跟defaulthost定义的主机名称同名;
Name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎;
Engine容器中可以包含Realm、Host、Listener和Valve子容器。
5. Host组件;
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机
相关属性:
appBase:此host的webapps目录,即存放非归档的web应用程序的目录或归档后的war文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;
6. Context组件;
Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;每一个context定义也可以使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf/<engine name>/<host name>。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。
相关属性:
docBase:相应的web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;
path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;
7. Realm组件;
一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
JAASRealm:基于Java Authintication and Authorization Service实现用户认证;
JDBCRealm:通过JDBC访问某关系型数据库表实现用户认证;
JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;
MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;
UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现;
8. Valve组件;
Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。Tomcat6中实现了多种不同的Valve:
AccessLogValve:访问日志Valve
ExtendedAccessValve:扩展功能的访问日志Valve
JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中;
RequestDumperValve:请求转储Valve;
RemoteAddrValve:基于远程地址的访问控制;
RemoteHostValve:基于远程主机名称的访问控制;
SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;
ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制;
SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp;
ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作;
相关属性:
className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny;
deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;
利用http或nginx反代至Tomcat:
LNMT:
演示:LNMT部署,并实现动静分离;
实验环境:
Nginx:192.168.19.143
Tomcat:192.168.19.141(动态服务器)
http:192.168.19.134(静态服务器)
Mariadb:192.168.19.134
1. 安装nginx,并编辑配置文件后启动服务;
2. 准备192.168.19.134的静态web服务器测试文件;
3. Tomcat动态服务器测试页即是上面的演示添加的测试页;启动tomcat服务
4. 测试;
访问tomcat的动态网页:可以发现图片没有加载出来,因为动态服务器的静态图片被发往了静态服务器。
访问静态资源:发往了静态服务器;
利用apache反代至tomcat服务器;
反代模块:
主:proxy_module
子:proxy_http_module,proxy_ajp_module
三种方法各自的工作流程;
Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
Client (http) --> httpd (mod_jk)(ajp) --> tomcat (ajp connector)
演示:
方式一:利用proxy_http_module模块;
实验环境:
http服务器(proxy):192.168.19.143
tomcat服务器:192.168.19.141
1. 编辑/etc/httpd/conf/httpd.conf文件;注释以下内容;
2. 新建配置文件/etc/httpd/conf.d/proxy_httpd.conf,编辑虚拟主机,配置使用proxy_http_module反代;
Centos7配置:
Centos6配置:
3. 启动httpd服务器,测试;
方法二:利用proxy_ajp_module模块代理;
1. 备份之前的配置文件,并创建一个新的以conf结尾的配置文件,命名为proxy_ajp.conf;
Centos6:
2. 重启服务,浏览器访问测试;
Tomcat Cluster
会话保持:
Session sticky
Source ip
Cookie
Session cluster
Session server
Kv:memcached,redis
1) LB tomcat
Nginx tomcats
Apache tomcats
2) LB tomcat cluster
3) LB tomcat
Session server
Memcached
这里nginx调度不作过多说明,下面主要介绍httpd调度;
apache: tomcats
1) apache:
mod_proxy
mod_proxy_http
mod_proxy_balancer
tomcat:
http connector
2) apache:
mod_proxy
mod_proxy_ajp
mod_proxy_balancer
tomcat:
ajp connector
3) apache:
mod_jk
tomcat:
ajp connector
演示:httpd负载均衡调度两台tomcat
实验环境:
一个调度器,两个Tomcat服务其,调度器使用httpd调度;
Httpd(director):192.168.19.143
Tomcat A:192.168.19.141
Tomcat B:192.168.19.200
1. 编辑server.xml配置文件,添加一个host,并修改默认engine;
2. 创建相关目录,并提供测试文件;
3. 启动tomcat服务,查看端口并测试;
访问测试;
4. TomcatB节点2的配置与node1类似,配置文件如下;
测试文件如下:
启动服务后访问测试:
第一种方式:基于module_httpd模块;
1. 编辑httpd配置文件;
2. 重启服务,测试;
第二种方式配置文件:
如果需要实现会话绑定,则需编辑配置文件,添加以下内容;
重启httpd服务后测试,就能实现会话绑定;
补充:mod_proxy_balancer模块有一个内置的manager:
编辑配置文件:
Note:此项应该添加到反代的前面过滤,否则会先反代至后端服务器而报错;
重启服务测试:
第三种方式:mod_jk(需要额外编辑安装)
mok_jk模块实现与后端tomcat做负载均衡是基于ajp协议的,因为mod_jk模块已经不在是httpd服务的自带模块,因此要使用mod_jk模块实现,必须手动编译mod_jk模块为httpd的模块才可使用。
1. 下载tomcat-conectors软件,并解压;
2. 编辑mod_jk为httpd的模块,需要指定--with-apxs选项,表示将mod_jk模块便以为httpd的模块,所以先确认是否有apxs工具,没有的话则需要安装,apxs由http-devel提供;
3. 配置;
(1) 反向代理
模块配置文件:mod_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
workers配置文件:workers.properties
worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=172.16.100.68
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status
注意:status的访问要做访问控制;
(2) 负载均衡
模块配置文件:mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcluster1
JkMount /status/ stat1
workers配置文件:workers.properties
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.100.68
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.100.69
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 0
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status
要想实现session绑定只需修改worker.lbcluster1.sticky_session = 1即可
Session Cluster:
session manager:会话管理器
StandardManager
PersistentManager:
FileStore
JDBC
DeltaManager
BackupManager
构建步骤:
(1) 各节点配置使用deltamaanager:在各节点的server.xml文件中添加以下内容;可以添加engine中或者host中;
<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.1.7"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
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.ClusterSessionListener"/>
</Cluster>
(2) 为需要使用session cluster的webapps开启session distribution的功能:
WEB-INF/web.xml中添加
<distributable/>
可以在修改默认的web.xml或者将默认的复制到指定的应用程序目录下的web.xml中进行修改;
Memcahed:
LiveJournel旗下Danga Interactive公司Brad。
高性能key/value数据缓存;
软件系统:
结构化数据:RDBMS
半结构化数据:JSON(Documentation) --> NoSQL
非结构化数据:文件系统
分布式:文件系统、存储;
FUSE
memcached的特点:
协议简单
基于libevent事件处理
基于内存完成数据存储:LRU
memcached互不通信的集群:分布式
旁挂式缓存:
一半在客户端;一半在服务端;
php: extensions
memcache, memcached
c: libmemcached
内存存储:
slab allocation:整理内存以进行复用;
slab allocator
Page: 分配给slab用于再次分割为chunk的内存空间;
chunk:用于缓存缓存对象的空间;
slab class:特定大小的chunk组合而成的组;
memcached-tool查看stats:
#:slab class的编号;
Item_size:Chunk大小;
Max_age:缓存对象的生存时间;
Pages:分配给slab内存页数;
Count:slab内的记录数;
Full?:slab内是否仍有空闲chunk;
分布式机制:
互不通信的分布式集群;
演示:使用msm(memcache-session-manager)实现tomcat会话存储在session服务器上
1. 首先在两个节点上分别安装memcached服务,并都启动memcached服务;
2. Tomcat要先配置使用memcached作为session服务需要以下几个软件包;
3. 将这些包复制到tomcat的lib目录下;
4. 配置tomcat,编辑主配置文件server.xml,添加字以下内容;添加到context内;
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.100.9:11211,n2:172.16.100.10:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
5. Httpd反代配置文件;
6. 重启服务,测试;
Linux自学笔记——tomcat及tomcat cluster
标签:tomcat session cluster memcached apache反代tomcat
原文地址:http://blog.51cto.com/claude666/2083706