Tomcat基础
一、Tomcat体系结构
tomcat应该是java程序员最熟悉的servlet容器了,作为一个用java实现的web应用程序服务器,下图是tomcat的体系结构
一个常见的Tomcat配置文件以下xml结构所示,对应上图的不同组件,每个组件都是个Java Class
<Server>
<Service>
<connector/>
<connector/>
<Engine>
<Host />
<Host>
<Context/>
...
</Host>
</Engine>
</Service>
</Server>
下文会对每个组件详细说明
tomcat的安装:...略,注意安装完配置环境变量
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
二、Tomcat管理
2.1 Tomcat配置文件
tomcat的目录结构:
- bin: 脚本 启动类
- lib: 依赖jar包
- conf: 配置文件
- logs: 日志文件
- webapps: webapp的默认目录
- work: 工作目录
- temp: 临时文件目录
tomcat的配置文件:
- server.xml:主配置文件;
- context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp程序目录下的WEB-INF目录中,用于定义会话管理顺、JDBC等 ;conf/context.xml是为各webapp提供默认配置;
- web.xml:每个webapp只有在“部署”之后才能够被访问;此文件则用于为各webapps定义默认的部署操作方式;
- tomcat-users.xml:用户认证的账号和密码配置文件;
- catalina.policy:当使用-security选项来启动tomcat实例时会读取此配置文件来实现基于安全策略的运行方式;
- catalina.properties:Java属性的定义文件,用于设定类加载器路径等 ,以及一些与JVM性能相关的调优参数;
- logging.properties:日志系统相关的配置;
2.2 TOMCAT启动脚本
以下实例是适用于CentOS6的chkconfig服务脚本
#!/bin/bash
#
# chkconfig: -
# description: Tomcat start/stop/status script #Location of JAVA_HOME (bin files)
export JAVA_HOME= #Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH #CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat #TOMCAT_USER is the default user of tomcat
TOMCAT_USER=www #TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT= tomcat_pid() {
echo `ps -ef | grep $CATALINA_HOME | grep -v grep | tr -s " "|cut -d" " -f2`
} start() {
pid=$(tomcat_pid)
if [ -n "$pid" ];then
echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
else
echo -e "\e[00;32mStarting tomcat\e[00m"
if [ `user_exists $TOMCAT_USER` = "" ];then
su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
else
$CATALINA_HOME/bin/startup.sh
fi
status
fi
return
} status(){
pid=$(tomcat_pid)
if [ -n "$pid" ];then
echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
else
echo -e "\e[00;31mTomcat is not running\e[00m"
fi
} stop() {
pid=$(tomcat_pid)
if [ -n "$pid" ];then
echo -e "\e[00;31mStoping Tomcat\e[00m"
$CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT
count=;
until [ `ps -p $pid | grep -c $pid` = '' ] || [ $count -gt $kwait ]
do
echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
sleep
let count=$count+;
done if [ $count -gt $kwait ];then
echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
kill - $pid
fi
else
echo -e "\e[00;31mTomcat is not running\e[00m"
fi return
} user_exists(){
if id -u $ >/dev/null >&; then
echo ""
else
echo ""
fi
} case $ in
start)
start
;; stop)
stop
;; restart)
stop
start
;; status)
status
;; *)
echo -e $TOMCAT_USAGE
;;
esac
exit
Sun Aug :: CST
2.3 tomcat 组件详解
2.3.1 Server组件
<Server port=”8005” shutdown=”SHUTDOWN”>
这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。
Server的相关属性:
className: 用于实现此Server容器的完全限定类的名称,默认为org.apache.catalina.core.StandardServer;
port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
2.3.2 Service:定义一个服务
官方解释:A Service is a group of one or more Connectors that share a single Container to process incoming requests. This arrangment allows, for example, a non-SSL and ssl connector to share the same population of web apps.
<Service name=”Catalina”>
Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。
这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。
Service相关的属性:
className: 用于实现service的类名,一般都是org.apache.catalina.core.StandardService。
name:此服务的名称,默认为Catalina;
2.3.3 Connector:定义一个连接器
官网解释:
HTTP: The Http connnectors is setup by default with Tomcat, and is ready to use. This connector features the lowest latency and best overall performance.
AJP: When using a single server, the performance when using a native webserver in front of the Tomcat instance is most of the time significantly worse than a standalone Tomcat with its default HTTP connector, even if a large part of the web application is made of static files. If integration with the native webserver is needed for any reason, an AJP connector will provide faster performance than proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. It is otherwise functionally equivalent to HTTP clustering.
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
1) HTTP连接器
2) SSL连接器
3) AJP 1.3连接器
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443"/>
定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port”,定义AJP连接器时必须定义的属性只有"protocol",因为默认的协议为HTTP。以下为常用属性的说明:
- 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所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
下面是一个定义了多个属性的SSL连接器:
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
Tomcat HTTP的连接器分为三类:
(1) 基于Java的HTTP/1.1连接器,这也是Tomcat6默认使用的连接器;它是Tomcat作为Standalone模式工作时所用到的连接器,可直接响应来自用户浏览器的请求;默认是8080端口
(2) 基于Java开发的NIO HTTP/1.1连接器,非阻塞式IO和Comnet,在基于库向tomcat发起请求时,此连接器表现不俗;
(3) C/C++开发的native APR HTTP/1.1连接器,在负载较大的场景中,性能不错,APR就是Apache Protable Runtime,它是一个能让开发者采用与平台无关分风格来开发C/C++代码本地库,可以很好的跨Linux和Unix等平台工作。此连接器从三个主要方面优化了系统性能并提升了系统的伸缩能力:(1)使用sendfile()内核模式调用发送大的静态文件;(2) 仅使用一个native code保持大量的连接;(3) 使用能够加速SSL请求处理的OpenSSL本地代码;
启用APR连接器的条件:
1) 将连接器的protocol属性设定为org.apache.coyote.http11.Http11AprProtocol;
2) APR的库文件已经在系统库文件的搜索路径内;
AJP(Apache JServ Protocol):
AJP是面向数据包的基于TCP/IP的协议,它在Apache和Tomcat的实例之间提供了一个专用的通信信道。目前常用AJP协议的版本是1.3,它主要有以下特征:
1) 在快速网络有着较好的性能表现,支持数据压缩传输;
2) 支持SSL,加密及客户端证书;
3) 支持Tomcat实例集群;
4) 支持在apache和tomcat之间的连接的重用;
附:如何安装apr
事先安装apr-devel包,而后编译安装tomcat的APR JNI。安装方法如下
# cd $CATALINA_HOME/bin
# tar xf tomcat-native.tar.gz
# cd tomcat-native-1.1.-src/jni/native/
# ./configure --with-apr=/usr --with-ssl --with-apxs
# make && make install # echo "/usr/local/apr/lib/" > /etc/ld.so.conf.d/apr.conf
# ldconfig
2.3.4 Engine:定义一个Servlet引擎
<Engine name="Catalina" defaultHost="localhost">
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。如前面示例中定义的:
常用的属性定义:
defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;
name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎;
jvmRoute=
Engine容器中可以包含Realm、Host、Listener和Valve子容器。
2.3.5 Host:定义一个虚拟主机
常用属性说明:
1) appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
2) autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
3) unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;
虚拟主机定义示例:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps">
<Context path="" docBase="ROOT"/>
<Context path="/bbs" docBase="/web/bss"
reloadable="true" crossContext="true"/>
</Host> <Host name="mail.magedu.com" appBase="/web/mail">
<Context path="/" docBase="ROOT"/>
</Host>
</Engine>
如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下
<Host name="www.magedu.com" appBase="webapps" unpackWARs="true">
<Alias>magedu.com</Alias>
</Host>
2.3.6 Context组件
Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;如下面的定义:
<!-- Tomcat Root Context -->
<Context path="" docBase="/web/webapps"/> <!-- buzzin webapp -->
<Context path="/bbs"
docBase="/web/threads/bbs"
reloadable="true">
</Context> <!-- chat server -->
<Context path="/chat" docBase="/web/chat"/> <!-- darian web -->
<Context path="/darian" docBase="darian"/>
在Tomcat6中,每一个context定义也可以使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf/<engine name>/<host name>。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。
常用的属性定义有:
1) docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;
2) path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义;
3) reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;
2.3.7 Valve 阀门
官网:A Valve is a request processing component associated with a particular Container. A series of Valves are generally associated with each other into a Pipeline. The detailed contract for a Valve is included in the description of the invoke() method below.
HISTORICAL NOTE: The "Valve" name was assigned to this concept because a valve is what you use in a real world pipeline to control and/or modify flows through it.
用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
- 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进行工作;
RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的访问控制功能;如下面的Valve则实现了仅允许本机访问/probe:
<Context path="/probe" docBase="probe">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
其中相关属性定义有:
1) className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
2) allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny;
3) deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;
三、 httpd反代tomcat
3.1 实现反向代理
tomcat作为应用程序服务器,并不适合处理静态资源,前端一般都会放置一个代理服务器,可以是nginx或者httpd。前面说过,tomcat支持2大类的Connecotr,nginx只能反代http类的协议,而httpd服务器同时支持http协议和ajp协议。下面演示httpd的二种反代配置,使用httpd的虚拟主机即可。
第一种:Client --> http --> httpd --> reverse_proxy_module (http) --> tomcat (http connector)
httpd需要模块proxy_module, proxy_http_module
配置如下:
<VirtualHost *:>
ServerName tc1.ysz214.com
# 关闭正向代理
ProxyRequests Off
ProxyVia On
# 支持tomcat的虚拟主机机制
ProxyPreserveHost On
# 权限控制
<Proxy *>
Require all granted
</Proxy>
# 反向代理
ProxyPass / http://localhost:/
#
ProxyPassReverse / http://localhost:/
# 访问控制
<Location />
Require all granted
</Location>
</VirtualHost>
第二种只要将8080端口修改为tomcat的8009端口,默认监听ajp连接器的端口是8009
Client --> http --> httpd --> reverse_proxy_module (ajp) --> tomcat (ajp connector)
依赖于模块proxy_module, proxy_ajp_module
<VirtualHost *:>
ServerName tc1.ysz214.com
# 关闭正向代理
ProxyRequests Off
ProxyVia On
# 支持tomcat的虚拟主机机制
ProxyPreserveHost On
# 权限控制
<Proxy *>
Require all granted
</Proxy>
# 反向代理
ProxyPass / ajp://localhost:/
#
ProxyPassReverse / ajp://localhost:/
# 访问控制
<Location />
Require all granted
</Location>
</VirtualHost>
3.2 实现负载均衡
3.2.1 第一种方式
利用http connector,需要httpd三个模块:
mod_proxy
mod_proxy_http
mod_proxy_balancer
实现负载均衡:
byrequests
bybusyness
<proxy balancer://lbcluster1>
BalancerMember http://172.16.100.68: loadfactor= route=TomcatA
BalancerMember http://172.16.100.69: loadfactor= route=TomcatB
ProxySet lbmethod=bybusyness
</proxy> <VirtualHost *:>
ServerName web1.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
如果想要实现会话粘性
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember http://172.16.100.68: loadfactor= route=TomcatA
BalancerMember http://172.16.100.69: loadfactor= route=TomcatB
ProxySet stickysession=ROUTEID
</proxy> <VirtualHost *:>
ServerName web1.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
说明,管理接口
<Location /balancer-manager>
SetHandler balancer-manager
Proxypass !
Order Deny,Allow
Allow from all
</Location>
3.2.2 第二种方式
跟上面的类似,只是换成ajp协议,建议使用ajp,不要使用第三种方式jk的方式.
- mod_proxy
- mod_proxy_ajp
- mod_proxy_balancer
#Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.100.68: loadfactor= route=TomcatA
BalancerMember ajp://172.16.100.69: loadfactor= route=TomcatB
ProxySet stickysession=ROUTEID
</proxy>
1
<VirtualHost *:>
ServerName web1.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
3.2.3 第三种方式 基于mod_jk进行反代
mod_jk 模块可以在tomcat官网Connectors中找到下载,需要额外编译安装
yum install httpd-devel
tar zxf tomcat-connectors-VERSION.tar.gz
cd tomcat-connectors-VERSION/native
./configure --with-apxs/usr/bin/apxs
make
make install
(1) 反代配置
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=
worker.TomcatA.host=172.16.100.68
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=
worker.stat1.type = status
说明: 其中ajp13是后端服务器协议,ajp,版本是1.3
(2) 负载均衡配置
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
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.100.68
worker.TomcatA.port =
worker.TomcatA.lbfactor =
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.100.69
worker.TomcatB.port =
worker.TomcatB.lbfactor =
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session =
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status
如果要会话绑定, tomcat需要配置Engine属性中的jvmRoute,且和worker名称一致
四、Tomcat Cluster
功能:一个通过多播协议进行的会话集群
基本没啥人用,这里随便说下怎么配置
(1) 配置server.xml
<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.101.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.1.212"
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>
说明:其中228.101.0.4是多播地址,本地的地址是192.168.1.212
(2) 每个需要被集群管理的webapp中要配置web.xml
WEB-INF/web.xml中添加
<distributable/>
Tomcat基础的更多相关文章
- Tomcat基础教程(二)
上一篇说到了Tomcat的介绍,下载及安装,这一篇我会详述Tomcat服务器结构 一.Tomcat服务器结构图: Tomcat服务器中可以配置多个Service,每个Service可以包含多个Conn ...
- Tomcat 基础优化
作者:北京运维 本文档是身边一些朋友.技术大佬之前分享的一些笔记,记录了 Tomcat 优化方法,笔记较多而且比较杂乱,经过整理.分类我个人觉得大致可以从以下几个方面优化 Tomcat: Tomcat ...
- Tomcat基础配置和高级配置
********** 第一部分 Tomcat基础配置 *********** 一.Apatch Tomcat 在win下配置 大部分转载自:http://blog.csdn.net/liuhao ...
- web服务器专题:tomcat基础及模块
Web服务器专题:Tomcat(一)基础架构 针对java系的经典服务器,打算系统的整理一下Tomcat的机制和一些原理,以此记录. 插一则题外话,关于tomat这个名字的由来:Tomcat 名称的由 ...
- 【WEB】Tomcat基础使用知识
由于当前项目性质原因,从开始到现在使用的WEB服务器都是WAS,而Tomcat的基础知识也慢慢地被遗忘.由于种种原因,让我参与到了另外一个全新的项目,使用的是Tomcat6.X,所以复习是必须的,而写 ...
- Tomcat 基础二
1.Tomcat 实现了一个新的Servlet容器Catalina: 2.Tomcat: ROOT | |____ / ...
- tomcat 基础知识学习
1: 直接将web项目文件件拷贝到webapps 目录中,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用,所以可以将JSP程序打包成一个 wa ...
- 2016-2-10 tomcat基础学习
安装tomcat服务器(1)配置 JAVA_HOME指向你的jdk主目录 也可以在startup.bat文件中设置JAVA_HOME环境变量. 首次使用JAVA_HOME前设置即可.set JAVA_ ...
- 【solr】 solr 5.4.1 和tomcat 基础环境搭建
下载省略; solr下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/ tomcat 下载安装(省略). solr5.4.1 默认在jetty ...
- Tomcat基础教程(四)
一.将Web应用部署到Tomcat中 为什么要部署?将Web应用部署到Tomcat中,那么Tomcat就能找到相应的Web应用,当Tomcat启动时就会加载和初始化Web应用,而在Tomcat启动后, ...
随机推荐
- CG 标准函数库
(1)数学函数 函数 功能描述 abs(x) 返回输入参数的绝对值 acos(x) 反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值 all(x) 如果输入参数均不为0,则返回tu ...
- USB硬盘 raw之后,DiskGenius 恢复
最近,为了在E560上安装LINUX(先是gentoo,后是rhel7,最后是 centos7),用UltralISO 把一块移动硬盘给写成RAW格式了.现在又想把移动硬盘给恢复回去.采用一些方法,效 ...
- 【IE6的疯狂之九】li在IE中底部空行的BUG
曾经写过[IE6的疯狂之六]li在IE中底部3像素的BUG(增加浮动解决问题),原文地址:http://www.css88.com/archives/421: IE6 BUG大全: http://ww ...
- JSON.toJSONString的jar包问题
toJSONString()方法的jar包不在json-lib中,简单点阿里巴巴给我们封装好的json包,也是开源的alibaba.fastjson.JSON,网上搜fastjson应该就有了.
- select与ajax结合
要实现的功能是,点击select输入框,数据库里面的数据会以option弹出. 这需要用到ajax异步连接数据库 下面贴出代码 先说明一下后台传递的数据是json,以map的形式传入的.后台代码很简单 ...
- HDU 1329 Hanoi Tower Troubles Again!(乱搞)
Hanoi Tower Troubles Again! Problem Description People stopped moving discs from peg to peg after th ...
- NOIP2015-普及组复赛-第一题-金币
题目描述 Description 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天( ...
- [其他]Jboss容器开启调试模式
1.登陆服务器: 2.找到$JBOSS_HOME/bin/run.conf 3.找到# Sample JPDA settings for remote socket debuging这项,并将说明下方 ...
- 安装TensorFlow的步骤
安装步骤: 1.安装虚拟机: 2.安装liunx系统: 3.安装TensorFlow. 1.安装虚拟机:虚拟机的版本是不能太低的.我使用的是:VMware-workstation-full-12.0. ...
- windows composer安装
百度网址 http://jingyan.baidu.com/article/19020a0a39d96e529c284279.html