tomcat

web container:
JDK, Servlet, JSP

商业实现:
WebSphere(IBM)
WebLogic (BEA --> Orace)
Oc4j
Glassfish
Geronimo
JOnAS
JBoss

开源实现:
Tomcat
Jetty
Resin

jsp --> jasper --> servlet(PAGE_jsp.java) --> complier --> bytecode (PAGE_jsp.class) --> JVM

tomcat: JWS + Jserv
catalina

jdk + tomcat

tomcat的组件:server.xml
<Server>
<Service>
<connector/>
<connector/>
<Engine>
<Host />
<Host>
<Context/>
...
</Host>
</Engine>
</Service>
</Server>

每个组件,均有java类来实现;

此些组件可分为如下几类:
顶级组件:Server
服务类:Service
连接器:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套的组件:valve, logger, realm, loader, manager
集群类组件:listener, ...

安装:
(1) 系统自带的openjdk+tomcat;

yum install java-1.7.0-openjdk

yum install java-1.7.0-openjdk-devel

yum install tomcat tomcat-admin-webapps tomcat-webapps

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/bin

source /etc/profile.d/java.sh

默认连接器:
http, 8080
ajp, 8009

(2) 使用Oracle JDK和tomcat主站提供的编译完成的程序包
rpm -ivh jdk-8u25-linux-x64.rpm

tar xf apache-tomcat-VERSION-tar.gz -C /usr/local
cd /usr/local
ln -s apache-tomcat-VERSION tomcat

tomcat的目录结构:
bin: 脚本及启动时用到类;
lib:类库;
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:日志系统相关的配置;

Java Webapp的组织结构:
有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等 ;
/:webapps的根目录
index.jsp:jsp的主页面文件
WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml;
META-INF/:当前webapp的私有资源目录,通常存储当前webapp自用的context.xml;
classes/: 当前webapp的私有类;
lib/:当前webapp的私有类,被打包成jar格式;

webapp归档格式:
.war:webapp;
.jar:EJB的类打包文件;
.rar:资源适配器类打包文件;
.ear:企业级应用程序;

手动添加一个测试应用程序:其目录为webapps(默认为/var/lib/tomcat/webapps/)
1、创建webapp特有的目录结构;

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

2、提供webapp的测试页面:

myapp/index.jsp

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
<% out.println("hello world");
%>
</body>
</html>

部署(deploy)webapp的相关操作:
deploy:将webapp的源文件放置于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp;将其特有的类通过class loader装载至tomcat:
有两种方式:
自动部署:auto deploy
手动部署:
(1) 冷部署:把webapp复制到指定位置,而后才启动tomcat;
(2) 热部署:在不停止tomcat的前提下进行的部署:
部署工具:manager app、ant脚本、tcd(Tomcat Client Deployer)等;
undeploy:反部署,停止webapp,并从tomcat实例上拆除其部署文件和部署名;
stop:停止,不再向用户提供服务;
start:启动处于“停止”状态的webapp;
redeploy:重新部署;

tomcat-admin-webapps包自带的应用程序:
manager app: webapp管理工具;
host manager: VHosts管理工具;

授权用户访问manager、status、host manager:由配置文件tomcat-users.xml定义;

vim /etc/tomcat/tomcat-users.xml

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user name="admin" password="adminadmin" roles="manager-gui,"/>

manager-gui - allows access to the HTML GUI and the status pages
manager-script - allows access to the text interface and the status pages
manager-jmx - allows access to the JMX proxy and the status pages
manager-status - allows access to the status pages only
admin-gui - allows access to the HTML GUI
admin-script - allows access to the text interface

tomcat:startup脚本:
#!/bin/sh

Tomcat init script for Linux.

#

chkconfig: 2345 96 14

description: The Apache Tomcat servlet/JSP container.

JAVA_OPTS='-Xms64m -Xmx128m'

JAVA_HOME=/usr/java/lastest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

case $1 in
start)
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec $CATALINA_HOME/bin/catalina.sh start ;;
*)
echo "Usage: basename $0 {start|stop|restart}"
exit 1
;;
esac

tomcat的常用组件:
每个组件几乎都是通过特有的类来实现,而且有的组件还不止一种实现方式;

Server:tomcat实例,即运行的一个jvm进程;监听于8005端口接收“SHUTDOWN”。各server监听的端口不能相同,因此,一个物理主机上启动多个server实例应该使用不同的端口;

service:用于实现将一个或多个connector关联至一个engine;

connector组件:
进入tomcat的请求可分为两类:
1、tomcat做为独立的应用程序服务器:standalone,此时,请求将来自于浏览器;
http, https
2、tomcat做为应用程序服务器:请求将来自于前面反代主机;
httpd: http, https, ajp
nginx: http, https

connector常用的属性:
address:监听的IP地址;
maxThreads:最大并发连接数,默认为150;
port:监听的端口;
protocol:连接器使用的协议,一般为HTTP/1.1或AJP/1.3;
redirecPort:重定向端口;
connectionTimeout:连接的超时时长,单位为毫秒,默认为60000;
enableLookups:是否通过dns查询;
acceptCount:定义等待队列的长度;
scheme:客户端请求标识;
debug:
secure:安全模式;
clinetAuth:客户端认证;
sslProtocol:ssl协议版本 建议TLS;

Engine:Servlet的一个实例,即servlet引擎,其内部可以有一个或多个Host组件来定义站点;通常需要通过defaultHost的属性定义默认虚拟主机;

属性:
name=Catalina
defaultHost=            :定义默认虚拟主机;
jvmRoute=                :定义jvm路由方式

Host组件:
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</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="node2.magedu.com" appBase="/data/webapps">
</Host>
</Engine>

为第二个虚拟主机提供测试webapp:
mkdir -pv /data/webapps/ROOT/{classes,lib,WEB-INF,META-INF}

主机别名定义:
如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下:
<Host name="www.magedu.com" appBase="webapps" unpackWARs="true">
<Alias>magedu.com</Alias>
</Host>

Context组件:
Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;如下面的定义:
示例:
<Host name="node2.magedu.com" appBase="/data/webapps">
<Context path="/test" docBase="testapp" reloadable="true"/>
</Host>

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

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实现;

下面是一个常见的使用UserDatabase的配置:
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

下面是一个使用JDBC方式获取用户认证信息的配置:
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test" connectionPassword="test"
userTable="users" userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />

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进行工作;

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;

示例:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node2_access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />

<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172.16.100.67"/>

tomcat动静分离方式:借用反向代理分流:

一、LNMT:
Client --> http --> Nginx --> reverse_proxy (http) --> tomcat (http connector)

location / {
root /usr/share/nginx/html;
index  index.html index.htm;
}

location ~* .(jsp|do)$ {
proxy_pass http://app1.magedu.com:8080;
}

二、LAMT:
Client --> http --> httpd --> reverse_proxy_module (http) --> tomcat (http connector)
Client --> http --> httpd --> reverse_proxy_module (ajp) --> tomcat (ajp connector)

第一种方式:proxy_module, proxy_http_module
第二种方式:proxy_module, proxy_ajp_module

(1) 第一种方式的配置机制,使用虚拟主机;(备注博客屏蔽ss R字样)
<VirtualHost :80>
ServerName tc1.magedu.com
ProxyRequests Off //关闭正向代理
ProxyVia On //响应报文提供Via信息,即由谁代理的
ProxyPreserveHost On //保留请求的主机名信息传递给后端服务器
<Proxy
>
Require all granted //什么人能访问此代理
</Proxy>
ProxyPass / http://localhost:8080/
ProxyPa***everse / http://localhost:8080/
<Location />
Require all granted //授权访问根的请求
</Location>
</VirtualHost>

(2)

<VirtualHost :80>
ServerName tc1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy
>
Require all granted
</Proxy>
ProxyPass / ajp://node2.magedu.com:8009/
ProxyPa***everse / ajp://node2.magedu.com:8009/
<Location />
Require all granted
</Location>
</VirtualHost>

Client --> http --> httpd --> mod_jk (ajp) --> tomcat (ajp connector)

tomcat cluster:

会话保持:
(1)session sticky:
source ip
cookie
hash
(2)session cluster
(3)session server

        一、apache + tomcat组合:

                    配置apache通过mod_proxy模块与Tomcat连接,要使用mod_proxy与Tomcat实例连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat集群时用到)等模块:
                    1、apache结合tomcat的http连接器:在httpd.conf的全局配置段或虚拟主机中添加如下内容:
                                                ProxyVia Off
                                                ProxyRequests Off
                                                ProxyPass / http://172.16.100.1:8080/
                                                ProxyPa***everse / http://172.16.100.1:8080/
                                                <Proxy *>
                                                    Require all granted
                                                </Proxy>
                                                <Location  / >
                                                    Require all granted
                                                </Location>

                    2、apahce结合tomcat的ajp连接器:在httpd.conf的全局配置段或虚拟主机中添加如下内容:
                                                ProxyVia Off
                                                ProxyRequests Off
                                                ProxyPreserveHost Off
                                                <Proxy *>
                                                    Require all granted
                                                </Proxy>
                                                    ProxyPass  /  ajp://172.16.100.1:8009/
                                                    ProxyPa***everse  /  ajp://172.16.100.1:8009/
                                                <Location  / >
                                                    Require all granted
                                                </Location>

                        关于如上apache指令的说明:

                                        ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。

                                        ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。

                                        ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为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将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。

                                        如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
                                        ◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
                                        ◇ maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
                                        ◇ nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
                                        ◇ stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
                                        上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
                                        <Proxy balancer://hotcluster>
                                            BalancerMember  http://www1.magedu.com:8080 loadfactor=1
                                            BalancerMember  http://www2.magedu.com:8080 loadfactor=2
                                            ProxySet  lbmethod=bytraffic
                                        </Proxy>

                                        ProxyPa***everse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。                       

                    启用balancer-manager管理接口:
                                                    <Location  /balancer-manager>
                                                                SetHandler   balancer-manager
                                                                ProxyPass   !
                                                                Require all  granted
                                                    </Location>

    3、配置apache通过mod_jk模块与Tomcat连接,mod_jk是第三方模块,是早期还没mod_proxy之前,实现tomcat的负载均衡,其官网https://tomcat.apache.org/download-connectors.cgi
                apxs由httpd-devel包提供;        
                        # tar xf tomcat-connectors-1.2.44-src.tar.gz 
                        # cd tomcat-connectors-1.2.44-src/native/
                        # ./configure --with-apxs=/usr/bin/apxs 
                        # make && make install

                        apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/conf.d/httpd-jk.conf来保存相关指令及其设置。其内容如下:
                                # Load the mod_jk
                                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.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。

                        worker.list = < a comma separated list of worker names >
                        worker. <worker name> .<property> = <property value>

                        其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:
                        worker.TomcatA.host=172.16.100.1

                        根据其工作机制的不同,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定义此属性;

                        另外,在负载均衡模式中,专用的属性还有:
                        ◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
                        ◇ method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
                        ◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。

                        根据前文中的指定,这里使用/etc/httpd/conf.d/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
                        worker.list=TomcatA,stat1
                        worker.TomcatA.port=8009
                        worker.TomcatA.host=172.16.100.1
                        worker.TomcatA.type=ajp13
                        worker.TomcatA.lbfactor=1
                        worker.stat1.type=status

                        至此,一个基于mod_jk模块与后端名为TomcatA的worker通信的配置已经完成,重启httpd服务即可生效。

            二、tomcat搭建session cluster:
                                Tomcat基于内存复制的集群
            (1)配置启用集群,另外注意engine的jvmRoute=需定义跟前端调度器一致;
    <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"
                  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.JvmRouteSessionIDBinderListener"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

以上内容定义在Engine容器中,则表示对所有主机均启动用集群功能。如果定义在某Host中,则表示仅对此主机启用集群功能。此外,需要注意的是,Receiver中的address="auto"一项的值最好改为当前主机集群服务所对应的网络接口的IP地址。

            (2)配置webapps
                            # cp /etc/tomcat/web.xml   WEB-INF/
                            vim     WEB-INF/web.xml     在<web-app>的标签内添加<distributable/>;

            三、session server;

            session会话保持之session服务器

            前提:
            两个tomcat节点:172.16.100.7(tomcatA.magedu.com),172.16.100.8(tomcatB.magedu.com)
            两个memcached节点:172.16.100.9, 172.16.100.10
            一个负载均衡节点:172.16.100.6

            Clients-->172.16.100.6-->(tomcatA, tomcatB)

            memcached-session-manager项目地址,http://code.google.com/p/memcached-session-manager/

            下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与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上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:

                                 <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
                                        <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"
                                        />
                                     </Context>

            分别为两个context提供测试页面:

            tomcatA:
            # mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
            # vim /usr/local/tomcat/webapps/test/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>

            tomcatB:
            # mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
            # vim /usr/local/tomcat/webapps/test/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>

            在172.16.100.6上配置反向代理的负载均衡内容,类似如下所示:
            <Proxy balancer://tomcat>
                    BalancerMember  http://172.16.100.7:8080 loadfactor=1
                    BalancerMember  http://172.16.100.8:8080 loadfactor=1
                    ProxySet  lbmethod=byrequests
            </Proxy>

            ProxyVia Off
            ProxyRequests Off
            ProxyPass / balancer://tomcat/
            ProxyPa***everse / balancer://tomcat/
            <Proxy *>
                    Order Allow,Deny
                    Allow From all
            </Proxy>

            <Location />
                    Order Allow,Deny
                    Allow From all
            </Location>

            测试结果,在浏览器中访问http://172.16.100.6/test,结果如下所示,其session ID在负载均衡环境中保持不变。

            TomcatA.magedu.com

            Session ID  4DD0340CE6294FF2BBE802CD4CD039EC-n2
            Created on  1399890838103

            TomcatB.magedu.com

            Session ID  4DD0340CE6294FF2BBE802CD4CD039EC-n2
            Created on  1399890838103

分布式系统:
1、系统的各组件分布于网络上多个计算机;
2、各组件彼此之间仅仅通过消息传递来通信并协调行动;

        分布式系统存在的意义:
                        1、向上扩展的性价比越来越低;
                        2、单机扩展存在性能上升临界点;
                        3、出于稳定性及可用性考虑,单机会存在多方面的隐患;

 

转载于:https://blog.51cto.com/11476314/2167153

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值