一、tomcat配置文件:
1、server.xml:核心配置文件,在上面初级中已介绍。
2、context.xml:上下文配置文件,为部署于此tomcat实例上的所有webApp(web应用程序)提供默认配置文件;
context.xml常用于定义会话管理器、JDBC以及Realm等。但每个webApp均可有自己独有的context.xml,
通常放置于每个webApp目录的META-INF。
3、web.xml:为部署于此tomcat实例上的所有webApp提供默认部署描述符;通常用于为webapp提供基本的servlet定义和MIME映射表等。
4、tomcat-users.xml:在上面初级中已介绍。
5、catalina.policy:java安全策略配置文件,当基于security选项启动tomcat实例时,会读取此配置文件。
6、catalina.properties:java属性定义文件,设定类加载路径、安全包列表和一些调整性能的参数信息。
7、logging.properties:日志相关的配置文件,日志级别、路径等。
二、tomcat部署方式:部署是指将webApp以及其所依赖类库等装载进tomcat实例上,以便接收用户请求。
1、静态方式:在tomcat启动前进行的webapp部署,静态方式是常用的部署方式。
2、动态方式:在不打断tomcat运行的前提下,通过tomcat manager或者其他的命令行工具进行的部署。
三、webapp体系结构:webapp有其特定的组织格式,是一种层次型目录结构。
1、/:webApp的根目录。
2、/WEB-INF:此webapp的私有资源目录(即用户通过浏览器不能直接访问),通常web.xml和context.xml均放置于此处。
3、/WEB-INF/classes:此webapp的自有的类。
4、/WEB-INF/lib:此webapp的自有的jar包。
5、/META-INF:此webapp的私有资源目录,并不是所有的webapp都有此目录。
四、Tomcat的运行方式:
1、单独配置(Standalone Configure):由tomcat自己完成http请求的全过程。
(1)、完成http请求。
(2)、处理静态文件(css、js、image等)。
(3)、处理动态jsp文件。
2、进程间配置:Apache/Nginx、Tomcat在同一台主机上完成http请求,实现动静分离。
(1)、Apache/Nginx接收http请求。
(2)、Apache/Nginx处理静态文件(css、js、image等)。
(3)、Tomcat处理动态jsp文件。
(4)、通过connector(http协议、AJP协议)使Apache/Nginx和Tomcat建立关联。
3、独立/网络配置:Apache/Nginx、Tomcat在不同主机上完成http请求,实现动静分离。
(1)、Apache/Nginx接收http请求。
(2)、Apache/Nginx处理静态文件(css、js、image等)。
(3)、Tomcat处理动态jsp文件。
(4)、通过connector(http协议、AJP协议)使Apache/Nginx和Tomcat建立关联。
五、Apache与Tomcat连接器通信的模块有两个:
1、mod_jk:apache/1.3,apache/2.0
可以基于http、ajp协议与tomcat进行通信,但一般用ajp协议。
2、mod_proxy:apache/2.2+(不过2.2+可以手工编译mod_jk)
可以基于http、ajp协议与tomcat进行通信。
3、mod_jk VS mod_proxy:
(1)、均可实现负载均衡,在实现负载均衡效果上mod_proxy稍弱那么一点点,但mod_proxy特性定制上比较强大。
(2)、均支持基于web页面来管理接口。
(3)、兼容性,mod_proxy已经成为Apache的标准模块,mod_jk需要额外手工安装。
(4)、配置:mod_proxy简单,mod_jk麻烦。
(5)、协议:mod_jk(ajp),mod_proxy(http/https、ajp)。
五、Tomcat的http连接器类型:
1、基于Java的HTTP1.1连接器,默认。
<connector port="8080" protocol="http/1.1" .../>
2、基于Java的高性能NIO HTTP/1.1连接器(但还不成熟,可能存在bug)。
<connector port="8080" protocol="org.apache.coyote.http11.Http11NIOProtocol" .../>
3、基于C/C++研发的Native APR HTTP/1.1连接器,在负载较大时一般使用此连接器,但为tomcat需要额外安装APR组件。
<connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" .../>
六、LAMT和LNMT:
1、LAMT(Linux+Apache+MySql+Tomcat):
(1)、Apache(mod_jk,ajp)+Tomcat(ajp connector)
(2)、Apache(mod_proxy,ajp、http/https)+Tomcat(ajp、http/https connector)
2、LNMT(Linux+Nginx+MySql+Tomcat):
Nginx+Tomcat(http/https connector)
七、LNMT详解:
1、Nginx + 1个Tomcat:
(1)、动、静均有tomcat处理:
#vim /etc/nginx/nginx.conf, 编辑
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://192.168.10.6:8088;
}
(2)、动、静分离,但静态文件由Nginx处理:
#vim /etc/nginx/nginx.conf, 编辑
location / {
root /web/htdocs;
index index.html index.htm;
}
location ~* \.(jsp|do)$ {
proxy_pass http://192.168.10.6:8088;
}
(3)、动、静分离,但静态文件由单独的服务器处理:
#vim /etc/nginx/nginx.conf, 编辑
location / {
root /web/htdocs;
index index.html index.htm;
}
location ~* \.(jsp|do)$ {
proxy_pass http://192.168.10.6:8088;
}
location ~* \.(jpg|jpeg|png|gif|doc|pdf|zip|rar|exe)$ {
proxy_pass http://192.168.10.8:8088;
}
2、Nginx + 2个Tomcat:
http{
upstream tomcat {
server 192.168.10.6:8080;
server 192.168.10.8:8080;
}
server{
location ~* \.(jsp|do)$ {
proxy_pass http://tomcat;
}
}
}
八、LAMT详解:
1、Apache + 1个Tomcat:
(1)、mod_proxy(http.https,ajp)
配置mod_proxy.conf内容如下:
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
ProxyPass / ajp://192.168.10.6.8009/
ProxyPassReverse / ajp://192.168.10.6.8009/
<Location />
Order Allow,Deny
Allow from all
</Location>
(2)、mod_jk(ajp)(注意需要手工编译安装mok_jk)
mod_jk.conf内容如下:
LoadModule jk_module modules/mod_jk.so
JkWordersFile /etc/httpd/conf.d/worders.properties
JkLogFile logs/mod_jk.log
JkLogLevel notice
JkMount /* /TomcatA
JkMount /status statA
worders.properties的内容如下:
worker.list=TomcatA,statA
worker.TomcatA.type=ajp13
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.10.6
worker.TomcatA.lbfactor=1
worker.statA.type=status
2、Apache + 2个Tomcat:
(1)mod_jk(ajp)实现负载均衡。
mod_jk.conf内容如下:
LoadModule jk_module modules/mod_jk.so
JkWordersFile /etc/httpd/conf.d/worders.properties
JkLogFile logs/mod_jk.log
JkLogLevel notice
JkMount /* /lbclusterA
JkMount /status statA
worders.properties的内容如下:
worker.list=lbclusterA,statA
worker.TomcatA.type=ajp13
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.10.6
worker.TomcatA.lbfactor=1
worker.TomcatB.type=ajp13
worker.TomcatB.port=8009
worker.TomcatB.host=192.168.10.7
worker.TomcatB.lbfactor=1
worker.lbclusterA.type=lb
worker.lbclusterA.sticky_session=0
worker.lbclusterA.balance_workers=TomcatA,TomcatB
worker.statA.type=status
(2)mod_proxy(http.https,ajp)实现负载均衡。
配置mod_proxy.conf内容如下:
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
<!--loadfactor为权重-->
<!--lbmethod为调度方法-->
<Proxy balancer://lb>
BalanceMember http://192.168.10.6.8080 loadfactor=1 route=TomcatA
BalanceMember http://192.168.10.7.8080 loadfactor=1 route=TomcatB
ProxySet lbmethod=bytraffic
</Proxy>
<!--stickysession实现Session绑定-->
ProxyPass / balancer://lb/ stickysession=JSESSIONID
ProxyPassReverse / balancer://lb/
<Location />
Order Allow,Deny
Allow from all
</Location>
注意:负载均衡,且实现会话绑定时要注意给每个tomcat实例的egine容器定义一个jvmRoute属性,如上tomcatA、tomcatB,
此名称要跟前端调度模块中使用的名称保持一致。另外,在mod_proxy实现负载均衡的会话绑定时,还要使用stickysession=JSESSIONID(JSESSIONID字符要大写)。
九、LB(Cluster Balance 负载均衡集群)总结:
1、4层LB:
(1)、lvs
(2)、haproxy(tcp)
2、7层LB:
(1)、apache(mod_jk,mod_proxy):ajp
(2)、apache(mod_proxy),haproxy,nginx:http
十、构建DeltaManager集群步骤(即会话复制集群,这种集群只适用于小规模的集群环境中):
1、在各节点的server.xml的engine货host容器中,添加如下内容:
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>
(注意修改MemberShip组件中的多播地址address="228.0.0.4",
建议修改Receiver中的address为本机能够传递心跳信息的地址)
2、在各节点为使用组播地址添加组播路由,格式:
route add -net ¥MCAST_ADDRESS netmask 255.255.255.255 dev eth0
3、在相应应用程序的web.xml中添加<distributable\>
十一、Session服务器Memcached-Session-Manager:
参考文件:
https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
http://sourceforge.net/
http://www.slideshare.net/
https://zh-cn.wordpress.com/
https://code.google.com/
https://github.com/
十二、JVM管理的内存段可分为两类:线程共享内存和线程私有内存:
1、线程共享内存:
(1)java方法区:存储jvm加载的class、常量、静态变量、即时编译器编译后的代码等。
(2)java堆内存=新生代空间+老年代空间:堆内存存储java的所有对象实例、数组等。
2、线程私有内存:
(1)程序计数寄存器:每个线程都有自己的计数寄存器,存储当前线程执行字节码的地址。
(2)jvm栈:jvm会为每个运行线程分配一个栈区,线程调用方法时和方法返回时会进行入栈和出栈操作。
(3)本地方法栈区:与jvm栈类似,只不过此区域是为调用本地方法服务。
十三、JVM进程内部内存组织结构,见下图:
1、定义“堆内存”空间边界
-Xms:堆内存空间的初始值
-Xmx:堆内存空间的最大值
2、定义“堆内存”空间内部内存的情况
-XX:NewSize:堆内存空间新生代的初始值
-XX:MaxNewSize:堆内存空间新生代的最大值
3、定义持久代空间的值
-XX:PermSize:持久代空间的初始值
-XX:MaxPermSize:持久代空间的最大值
备注:堆内存=新生代空间+老年代空间,JVM虚拟机内存参数调整如上1 、2、 3。
十四、Java性能查看工具:
jconsole,jprofiler