tomcat--高级

一、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进程内部内存组织结构,见下图:

wKiom1XX3bDCaii6AAJyvoXyu9U815.jpg

1、定义“堆内存”空间边界

    -Xms:堆内存空间的初始值

    -Xmx:堆内存空间的最大值

2、定义“堆内存”空间内部内存的情况

    -XX:NewSize:堆内存空间新生代的初始值

    -XX:MaxNewSize:堆内存空间新生代的最大值

3、定义持久代空间的值

    -XX:PermSize:持久代空间的初始值

    -XX:MaxPermSize:持久代空间的最大值

备注:堆内存=新生代空间+老年代空间,JVM虚拟机内存参数调整如上1 、2、 3。


十四、Java性能查看工具:

jconsole,jprofiler


你可能感兴趣的:(tomcat)