Tomcat是基于JAVA开发的一个web容器,下面我们首先了解一下Java。

一、Java的组成

    java由4部分组成:

    1、java编程语言

    2、java类文件

    3、java API

    4、java虚拟机(jvm) 

   java编程语言和java API生成.java文件,.java文件通过编译成为.class类文件和别的类文件一起通过类加载器在jvm中运行    

    JRE和JDK

    JRE: Java Runtime Environment
    JDK:Java Development Kit
    JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
    JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

    J2SE、J2EE和J2ME

    针对企业网应用的J2EE(Java 2Enterprise Edition)、针对普通PC应用的J2SE(Java 2 StandardEdition)和针对嵌入式设备及消费类电器的J2ME(Java 2 MicroEdition)三个版本

    tomcat_tomcat

    Java运行时的区域

    方法区:线程共享;用于存储被虚拟加载的类信息、常量、静态变量等;永久代;

    堆:Java堆是jvm所管理的内存中最大的一部分;也是GC管理的主要区域,主流的算法都基于分代收集方式进行:新生代和老年代;线程共享

    Java栈:线程私有,存放线程自己的局部变量等信息;

    PC寄存器(Program Counter Register),线程独占的内存空间;

    本地方法栈

    Servlet和JSP

    tomcat_tomcat_02

    当Web服务器(或Servlet引擎,应用服务器)支持JSP引擎时,JSP引擎会照着JSP的语法,将JSP文件转换成Servlet代码源文件,接着Servlet会被编译成Java可执行字节码(bytecode),并以一般的Servlet方式载入执行

二、Tomcat

    Tomcat就是一个Java EE的不完整实现,是一个web容器,也可以称为web服务器。它只使用了Java EE附带的两个类库-----Servlet与JSP。

    1、架构

    tomcat_tomcat_03

    核心架构:

        server:为顶级容器,管理多个service的接口。

        service:由一个container和多个connector组成,由server进行管理

        connector:connector和container通过service交互

        container???

         一个或者多个Container 可以对应一个Connector,这样就组成了一个Service,Service生命周期的由Server进行管理

    tomcat_tomcat_04

tomcat_tomcat_05

     

<Server>      #顶层元素,代表一个服务器
  <Service>   #顶层元素,是Connector的集合,只有一个Engine
      <Connector/>        #连接器类元素,代表通信接口
          <Engine>        #容器类元素,为特定的Service组件处理所有客户请求,可包含多个Host
              <Host>       #为特定的虚拟主机处理所有客户请求
                  <Context>     #为特定的WEB应用处理所有客户请求
                  </Context>
              </Host>
          </Engine>
</Service>
</Server>

    顶级组件:

        服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台服务器上可以在启动多个JVM的情况下每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立管理端口。这是一个顶级组件

         服务(service):一个服务组件通常包含一个引擎和此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情况下只为一个service指派一个server

    连接器类组件:

        连接器(connectors):负责连接客户端(可以是浏览器或web服务器)请求至Servlet容器内的web应用程序,通常指的是接受客户发来请求的位置及服务器段分配的端口。默认端口通常是HTTP协议的8080,管理员可以根据自己的需要改变此端口。一个引擎可以连接多个连接器,但这些连接器必须使用不同的端口。默认的连接器是HTTP/1.1的Coyote,同时Tomcat也支持AJP、JServ和JK2连机器。

    容器类组件:

        引擎(Engine):通常指Cataliana Servlet引擎,它检查每一个请求的HTTP首部信息辨别此请求应该发往到哪个host或context,并将请求处理后的结果发送给客户端。一个引擎可以包含多个主机组件。

        主机(Host):位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,类似于Apache的虚拟主机,但Tomcat只支持基于FQDN的虚拟主机。至少一个主机组件。

        上下文(Context):Context组件式最内层组件,代表Web应用程序本身。配置一个Context最主要的就是指定Web应用程序的根目录,一遍Servlet容器能将用户请求发往正确的位置。Context组件也可以定义包含错误页,实现用户访问发生错误时提供友好的提示信息。类似apache中的alias别名。

    被嵌套类组件:

        阀门(valve):可以定义在任何容器类的组件中,用来记录客户端请求/客户端IP地址和服务器等信息。

        日志记录器(logger):可以用于除Context之外的任何容器中。记录日志

        领域(Realm):一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。

    2、配置文件及参数说明

Tomcat的配置文件:

    server.xml:主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息

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

    web.xml:每个webapp只有在“部署”后才能被访问,此文件则用于为各webapps定义默认的部署方式;遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息

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

    catalina.policy:当使用-security选项来启动tomcat实例时,会读取此配置文件来实现基于安全策略的运行方式;

    catalina.properties:java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关的参数等;

    logging.propeties:日志系统相关的配置;

元素名属性解释
ServerclassName这个类必须是org.apache.catalina.Server的实现类,如果没有指定类名,则使用标准实现。
address这是等待关闭命令的TCP/IP地址,如果没有指定,默认使用localhost
port这个端口是用于接收关闭服务的端口,可以设置为-1来禁用。
shutdown这个命令字符串必须通过TCP/IP端口接收,才能关闭Tomcat。
ServiceclassName这个类必须是org.apache.catalina.Service的实现类。
nameService的展示名称,如果使用标准的Catalina组件,这个名称会包含在日志信息中。同一个Server下的每个Service的名称必须唯一。
ConnectorallowTrace是否允许TRACE HTTP方法,默认false。
asyncTimeout异步请求超时时间,单位毫秒,默认10000ms(10秒)。
enableLookups如果想使用request.getRemoteHost()方法通过DNS查找远程请求客户端的真实的主机名,则设置为true。设置为false会跳过DNS查找,直接返回IP地址。DNS查找默认禁用。
maxHeaderCount一个请求允许最大的请求头数量。如果超出限制请求会被拒绝。如果为负值,无限制。默认值100。
maxParameterCountGET和POST请求的参数(和值)的最大数量,超出的参数会被忽略。如果是0或者小于0,表示无限制。默认为10000。
maxPostSizePOST请求的最大字节数。如果为负,无限制。默认2097152字节(即2Mb)。
maxSavePostSizePOST请求的最大保存/缓冲字节数。-1表示无限制,0表示禁用保存/缓冲,默认为4096字节(4Kb)。
portTCP端口,用于创建Server socket并等待进入连接。操作系统允许1个服务器监听1个IP的1个指定端口。如果值为0,Tomcat会为这个Connector选择一个随机的空闲端口。
protocol

通信协议。默认为HTTP/1.1,这个协议使用自动切换机制来选择阻塞式基于Java的Connector或者基于APR/native的Connector。如果要使用明确的协议,而不是自动切换机制选择的协议,可以选择下面的值:

  • org.apache.coyote.http11.Http11Protocol – 阻塞 Java connector

  • org.apache.coyote.http11.Http11NioProtocol – 非阻塞 Java connector

  • org.apache.coyote.http11.Http11AprProtocol – APR/native connector.也支持自定义的实现。

proxyName如果当前Connector使用代理配置,使用这个属性指定Server名称。这个Server名称,可以调用request.getServerName()方法返回。
proxyPort指定代理的Server端口。
redirectPort如果当前Connector不支持SSL请求,但是收到的请求匹配web.xml中配置的security-constraint选项,要求使用SSL端口,那么Catalina会自动把请求转发到这个指定端口。
scheme给当前协议设置一个名字,这样可以通过request.getScheme()方法获得协议名词,比如给SSL协议取名HTTPS。默认值为http。URIEncoding:字符编码。用于URI字节解码,和URL %xx部分数据的解码。默认为ISO-8859-1。
useIPVHosts将该属性设置为true会导致Tomcat使用收到请求的IP地址,来决定将请求发送到哪个主机。默认false。
acceptCount当所有的可用线程都在使用中,传入连接请求队列的最大长度。当队列满时,任何请求都会被拒绝。默认100。
address如果服务器有多个IP,这个属性指定使用哪个IP地址用于监听端口。默认使用与服务器关联的全部IP地址。
compressableMimeTypeHTTP压缩的元数据类型,参数可以使用逗号间隔。默认为text/html,text/xml,text/plain,text/css,text/javascript,application/javascript。
compression

为了节省服务器带宽,Connector可以使用HTTP/1.1 GZIP压缩。

  • on:允许压缩,这会引起文本数据被压缩。

  • off:禁用压缩。

  • force:强制在所有情况下压缩。

  • 某整数:压缩前的最小字节量,否则不压缩。默认为false。

compressionMinSize当compression设置为on,指定压缩前的最小数据量。默认为2048。
connectionTimeout连接超时时间。-1表示无限制。默认值60000ms(60秒)。但server.xml默认配置为20000。
disableUploadTimeout是否禁用上传超时时间,开启后,上传数据的连接使用单独的超时时间。
connectionUploadTimeout上传数据时,连接超时时间。
executor指向Executor元素的引用。如果设置了这个元属性,并且对应的Executor存在,Connector将使用这个Executor,而其他所有线程相关属性将被忽略。如果未指定此属性,Connector会使用一个私有的、内部Executor来提供线程池。
executorTerminationTimeoutMillis在关闭Connector之前,那个私有的、内部Executor等待请求处理线程的终结的超时时间。BIO Connector默认值为0ms。NIO和APR/native Connector默认值为5000ms。
keepAliveTimeout长连接超时时间。Connector在关闭连接之前,会等待另一个HTTP请求的时间。默认值是connectionTimeout的属性值。-1无超时时间。
maxKeepAliveRequestsHTTP请求最大长连接数量。如果值为1,禁用长连接。设为-1,无限制。默认值为100。
maxConnections在任何给定的时间服务器接收并处理的最大连接数。当这个数字已经达到了,服务器将不会接受任何连接,直到连接的数量降到低于此值。基于acceptCount,操作系统可能仍然接收连接。
maxHttpHeaderSize请求头和响应头的最大字节数。默认8192(8Kb)
maxThreads最多同时处理的请求的最大线程数量,这决定了同时处理请求的最大数量。默认200。
minSpareThreads最小空闲线程数量。默认10。
socketBufferSocket输出缓冲区大小。单位字节。-1表示禁用缓冲区。默认值9000字节。
SSLEnabled是否开启SSL加密传输。需要配置secure和scheme属性。
Contextcookies是否使用cookie,可以通过cookie鉴别session。默认true。设置为false,则无法使用cookie完成session鉴证,然后必须依赖于URL重写。
docBase应用程序文件的根目录。如果应用程序不在Host元素的appBase路径下,需要设置此属性。
path应用程序的访问路径(context path)。
reloadable自动重新加载class和jar文件。设置为true,Catalina会监视/WEB-INF/classes/ 和/WEB-INF/lib目录下的变动,如果检测到变动就会自动重新加载应用程序。此功能非常有用但是不建议在生产环境使用。
EnginedefaultHost默认的主机名,它必须指向一个Host元素的name属性。
nameEngine的逻辑名称,用于日志和错误信息。如果在一个Server中使用多个Service元素,每个Engine必须使用唯一的名称。
jvmRoute在负载均衡场景中使用,用以实现会话黏性,此标识在参与集群的所有节点上必须唯一;
HostappBase此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
name一般是虚拟主机注册到DNS的网络名称。必须有一个Host的name作为Engine的defaultHost。
autoDelploy在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
unpackWars在启动此webapps时是否对WAR格式的文档文件先进行展开;默认为true;
RealmJAASRealm基于Java Authintication and Authorization Service实现用户认证;
JDBCRealm通过JDBC访问某关系型数据库表实现用户认证;
JNDIRealm基于JNDI使用目录服务实现认证信息的获取;
MemoryRealm查找tomcat-user.xml文件实现用户信息的获取;
UserDatabaseRealm基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现;
ValveAccessLogValve访问日志Value;
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进行工作;

三、Tomcat的安装

    1、安装jdk

    JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html?ssSourceSiteId=otncn

[root@master java]# rpm -ivh jdk-7u80-linux-x64.rpm 
[root@master bin]# vim /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
[root@master java]# java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

    2、安装tomcat

    tomcat下载:http://tomcat.apache.org/ 

[root@node1 local]# tar -xf apache-tomcat-7.0.82.tar.gz -C /usr/local/
[root@node1 local]# ln -s apache-tomcat-7.0.82 tomcat

    tomcat的目录:

    bin:存放命令的 其中Catalina.sh 是tomcat的启动关闭等程序的管理脚本

    conf:tomcat的配置文件

    logs:tomcat的日志文件

        tomcat启动后会在logs里生成多个日志文件

tomcat_tomcat_06        catalina.2017-10-30.log    tomcat自身运行的日志,通常也会输出至catalina.out,

但是应用向console输出的日志不会输出至此

        catalina.out    catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这里来。另外,如果我们在应用里使用其他的日志框架,配置了向Console输出的,则也会在这里出现

        localhost.2017-10-30.log    应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志,而这些未处理异常最终会导致应用无法启动

        localhost_access_log        访问日志(需在server.xml中配置)  

   <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

        日志的配置文件在conf/logging.properties中

        日志级别为:SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)

    webapps:应用程序部署的目录    

四、tomcat的部署

    1、拷贝你的WAR文件或者你的web应用文件夹到$CATALINA_HOME\webapps下,然后启动服务器就可以了。这种方式比较简单,但是web应用程序必须在webapps目录下。访问地址如下: 
http://localhost:8080/项目名/ 
    2、这种方式可以不必将PetWeb目录拷贝到webapps下,直接在F:\部署。方法如下,更改$CATALINA_HOME\conf\server.xml文件,在<host>标签内添加<Context>标签,内容如下:

<Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/> 
其中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载,这个属性在开发阶段通常都设为true,方便开发,在发布阶段应该设置为false,提高应用程序的访问速度。

docBase为路径,可以使用绝对路径,也可以使用相对路径,相对路径相对于webapps。path属性的值是访问时的根地址。访问地址如下:http://localhost:8080/Pet/ 
    3、这种方式和第二种方式差不多,但是不是在Server.xml文件中添加Context标签,而是在$CATALINA_HOME\conf\Catalina\localhost中添加一个xml文件,如Pet.xml,内容如下: 
<Context docBase="F:/PetWeb" reloadable="false" />大家可能发现和第二种方式差不多,但是缺少了path属性,这种方式服务器会使用.xml的名字作为path属性的值。访问地址如下:http://localhost:8080/Pet/ 


我们设置虚拟目录和主目录,都会在$CATALINA_HOME/localhost目录下生成相应的Xml文件,因此,当我们在server.Xml里面删除了主目录和虚拟目录的设置后,如果系统还没有生效,这时候我们就要察看一下这个目录下的Xml文件是不是已经被删除了,如果没有被删除,他还是对tomcat起作用的,我们必须手动删除。

每当我们访问一个地址的时候,tomcat首先是到$CATALINA_HOME/localhost目录下去察看有没有存在主目录或虚拟目录的Xml文件,如果有Xml文件,就按Xml里的路径进行访问,如果没有Xml文件,就到 server.Xml文件里去察看是否配置context标签,如果配置了context标签,则 在$CATALINA_HOME/localhost目录下生成一个对应的Xml文件,以便于下次直接验证而不再访问server.Xml,与此同时打开context里指定的路径,如果 server.Xml里没有配置context标签,则返回访问错误页面。

我们其实可以直接在$CATALINA_HOME/localhost下建立一个Xml文件,用于主目录或者虚拟目录,而不需要去修改server.Xml就可以达到配置主目录和虚拟目录的目的,具体Xml的格式可以如下:


<?xml version="1.0" encoding="UTF-8"?>

                    <Context path="/xxxxx"

                             docBase="/xxx"

                             reloadable="true" allowLinking="true">

                       /Context>


具体是主目录的配置还是虚拟目录的配置取决于path的值。另外主目录文件名必须是ROOT.Xml(root大写),而虚拟目录的文件名称和虚拟目录的名称一致并且为小写.


tomcat_tomcat_07


-Xmx:最大堆内存

-Xms:初始堆内存

-Xmn:年轻代内存大小

年轻代分eden区和survivor区,suvivor一般分两部分:from,to且永远有一个是空的

-XX:NewSize:设置 年轻代内存大小

-XX:MaxNewsize:年轻代内存最大大小

-XX:NewRatio:年轻代和年老代比例

-XX:SurvivorRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。

-XX:PermSize:持久代初始大小

-XX:MaxPermSize

-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256k。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 收集器设置

-XX:+UseSerialGC:设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器

-Xmx3550m  -Xms3550  -Xmn2g  -Xss128k  -XX:ParallelGCThreads=20  -XX:+UseConcMarkSweepGC  -XX:+UseParNewGC

        -XX:+UseConcMarkSweepGC:设置年老代为并发收集。

        -XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

在tomcat的catalina.sh中设置如下:

tomcat_tomcat_08