一、tomcat 介绍

   tomcat是基于JDK的web服务器,其能够运行Servlet和JSP规范。tomcat 5支持最新的Serlet 2.4和JSP 2.0规范。tomcat实际上是Apache服务器的扩展,但它是独立运行的。运行tomcat时,它实际上作为一个与Apache独立的进程,是单独运行的。Apache为HTML页面服务,而tomcat实际上运行JSP页面和Sservlet。tomcat具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是tomcat的默认模式。不过对于静态的HTML处理能力上,Apache能力更强。由于它的处理并发连接的效果不好,使用时通常前端使用Apache来做反向代理。

   官网:tomcat.apache.org

 附录:其他的java web服务器实现

            商业版本:WebSphereWebLogicOc4j… …

            开源实现:TomcatjettyResin

二、tomcat的一些知识点

 1、tomcat代码执行过程:

  

tomcat 的使用详解_tomcat

tomcat 的使用详解_其他_02

tomcat 的使用详解_其他_03


GC: Garbage Collector

JVM的运行时区域:

 方法区:线程共享,用于存储被JVM加载的class信息,常量,静态变量,方法等。  

 堆:是jvm所管理的内在中最大的一部分,也是GC管理的主要区域,主流的GC算法基于代收集的机制。

 Java栈:线程私有,存储线程自己的局部变量。

 PC寄存器:线程私有的存储空间,程序的指令指针。

 代码执行过程:

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


2、tomcat的配置文件

 server.xml:主配置文件


 context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序自己目录下的WEB-INF目录;此context.xml为每个webapp提供默认配置

 web.xml:每个webapp只有在部署后才能被访问,这些配置文件通常位于webapp应用程序自己的目录下的WEB-INF目录中;此文件则用于各webapps定义默认的部署方式

 tomcat-users.xml:用户认证的账号和密码文件

 catalina.policy:当用户使用 -security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略

 catalina.properties:java属性定义文件,用于设定类加载器路径等,以及一些调优

 logging.properties;日志相关的配置信息

3、WebAPP组织结构

 WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml

 META-INF/:当前webapp的私有资源的目录,通常存放当前webapp自用的context.xml

 classes/:类文件,当前webapp的私有类

 lib/:当前webapp的私有类,被打包成jar格式

4、tomcat的常用组件

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

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

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

 connector组件:进入tomcat的请求可以分为两类,tomcat作为独立的应用程序服务器,请求将来自于浏览器,协议有http和https

 tomcat作为应用程序服务器,请求来自于前面反代主机:

   httpd:http,https,ajp

   nginx:http,https

属性:

 address:监听的IP地址;

 maxThreads:最大并发连接数,默认为150;

 port:监听的端口;

 protocol:连接器使用的协议,一般为HTTP/1.1或AJP/1.3;

 redirecPort:重定向端口;

 connectionTimeout:连接的超时时长,单位为毫秒,默认为60000;

 acceptCount:定义等待队列的长度;

Engine:Servlet的一个实例,即servlet引擎,其内部可以有一个或多个host组件来定义站点,通常通过default定义虚拟主机:

 属性:name defaulthost jvmroute

Host组件:

 位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:


。。。。。。。还有几个组件,使用时注意

 ①一个物理主机上启动多个server实例应该使用不同的端口

 ②service:用于实现将一个或多个connector关联至一个engine,即一个service中只能有一个service,可以有多个connector。

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

 ④一个host中可以有多个context组件

三、tomcat使用实例

 ① 1)使用http协议

     前端使用httpd反向代理

     后端使用两个tomcat服务器

     实现负载均衡

   2)前端httpd 的配置:

    在/etc/httpd/conf/中添加:

      <proxy  balancer://tcsrvs>

         BalancerMember http://172.18.34.1:8080

         BalancerMember http://172.18.34.2:8080

         ProxySet lbmethod=byrequests

     <Proxy>

    再添加一虚拟主机:

    <VirtualHost *:80>

      ServerName lb.ridingonhorse.com

      ProxyVia On 

      ProxyRequests On

      ProxyPreserveHost On

      <Proxy *>

        Require all granted 

      </Proxy>

      ProxyPass  /  balancer://tcsrvs/

      ProxyPassReverse / balancer://tcsrvs/

      <Location />

        Require all granted 

      </Location>

    </VirtualHost>

########

  一些解释:

   ProxyVia On : 控制位于代理服务器链中的代理请求的流向

     Apache2.2的官方文档中的解释为:

      如果设置为默认值Off,将不会采取特殊的处理。

      如果一个请求或应答包含“Via:”头,将不进行任何修改而直接同通过。

       如果设置为Full,每个产生的“Via:”头中都会额外加入Apache服务器的版本,以“Via:”为注释出现。

      如果为On每个请求和应答都会对应前主机得到一个“Via:”头

      如果设置为Block ,每个代理请求中的所有“via:”头行将被删除。且不会产生新的“Via:”头。

    3)配置的梳理:

      代理到后端tomcat主机肯定需要代理模块以及定义代理模块

     所以首先定义后端主机服务器组

     在虚拟主机中引用,配置

     

   如果要实现回话粘贴:

    配置文件为:

    Header add Set-cookie "ROUTEID=%{BALANCER_WORKER_ROUTE}e;path=

     /"env=BALANCER_ROUTE_CHANGED


    <proxy balancer://tcsrvs>

        BalancerMember http://172.18.34.1:8080 route=TomcatA loadfactor=1 

       BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2   

       ProxySet lbmethod=byrequests

       ProxySet stickysession=ROUTEID

    </Proxy>

  

 <VirtualHost *:80>

    ServerName lb.ridingonhorse.com

   ProxyVia On

    ProxyRequests Off

   ProxyVia On

   proxypreservehost on 

   <proxy *>

      Require all granted 

   </Proxy>

   proxypass / balancer://tcsrvs/

   proxypassSeverse / balancer://tcsrvs/

   <Location />

     Require all granted 

  </Location>

 </VirtualHost>

 ②使用ajp协议,由于ajp协议为二进制协议,所以,通信跟快捷。与以上只有很小的差异。