Tomcat结构介绍,server.xml配置详解,连接器并发,乱码解决,虚拟主机配置,项目部署方式。

1. Tomcat简介

        Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在 Tomcat中得到体现。

尽管Tomcat也可以作为独立的Java Web服务器,但在对静态资源(HTML、图像文件等)的处理速度,Web服务器管理等方面都不如Apache、IIS服务器等其他专业的HTTP服务器,因此在实际应用中,常常把Tomcat与其他的HTTP服务器集成使用。对于不支持Servlet/JSP的HTTP服务器,可以通过Tomcat服务器来运行Servlet/JSP组件。

当Tomcat与其他HTTP服务器集成时,Tomcat服务器的工作模式通常为进程外的Servlet容器,Tomcat服务器与其他HTTP服务器之间通过专门的插件来通信。

 1.1 Tomcat的目录结构

$CATALINA_HOME   Tomcat安裝目录下面有
  • bin: 启动和关闭Tomcat脚本文件。
  • conf: Tomcat服务器的各种配置文件,包括:server.xml、web.xml、catalina.policy等。
  • lib: Tomcat服务器和所有web应用可以访问的jar包。
  • logs: Tomcat的日志文件。
  • webapps: Tomcat自带的两个web应用:admin和manager,用来管理Tomcat的Web服务。
  • work: JSP经过Tomcat编译后生成的Servlet。
  • temp: Tomcat运行时的临时文件。

1.2 启动时的jdk和jvm参数:
在catalina.bat文件的开头设置如下
    set JAVA_HOME=jdk路径
    set JAVA_OPTS  =jvm参数
            一般情况下,设置-Xms=-Xmx、-XX:PermSize=-XX:MaxPermSize,正式服务器必须设置以上参数,以尽可能压榨服务器性能。相关参数取值需要根据实际情况考虑,不要超过(物理内存-其他程序内存)的80%即可。

例如:
     set JAVA_HOME=C:\Java\jdk1.8.0_25
    set JAVA_OPTS  =-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

1.3 Tomcat常用配置文件

server.xml:Tomcat中最重要的配置文件,定义了tomcat的体系结构,包括连接器端口、连接数、集群、虚拟目录、访问日志等的设置。编码方式是在Connector连接器的属性:URIEncoding="utf-8"

context.xml:全局context的配置文件,包括JNDI等信息的配置。

tocmat-users.xml:Tocmat管理员身份的配置文件,关键是设置管理员账号的密码。

logging.properties:Tocmat日志配置文件,可以修改默认的Tocmat日志路径和名称。


1.4 日志的配置

        1.4.1 访问日志

                缺省配置下,Tomcat是不记录访问日志的,可以通过如下配置允许Tomcat记录访问日志:

                修改$CATALINA_HOME/server.xml,在Host标签下,找到如下配置信息,去掉两端的注释就会启用访问日志记录功能:

                    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>

通过对pattern项的修改,可以改变日志输出的内容。该项值可以为: common 与 combined,对应的日志输出内容如下所示:

common: %h %l %u %t %r %s %b

combined: %h %l %u %t %r %s %b %{Referer}i %{User-Agent}i

pattern 也可以根据需要自由组合, 例如 pattern="%h %l",对 于各 fields 字段的含义请参照Tomcat官方文档。


在不同的环境下,需要设置不同的日志级别,在生产环境中,为了提高效率和稳定性,一般会将日志级别设置为相对较高的级别,而开发环境中为了跟踪程序流程,可以将日志级别调整为较低的级别。不同日志框架有不同的日志级别,

常用的日志框架对应级别如下:

Java.util.logging对应的日志级别由高到低分别为:

severe > warning > info > config > fine > finer > finest

org.apache.log4j对应的日志级别由高到低分别为:

fatal > error > warn > info > debug > trace


            1.4.2 运行日志:

                    在缺省配置下,Tomcat采用Java.util.logging日志框架,对应的配置文件为$CATALINA_HOME/ logging.properties,常用的日志级别设定方法如下:

Catalina日志

默认日志框架:

设置catalina日志的级别为:FINE

catalina.org.apache.juli.FileHandler.level = FINE


禁用catalina日志的输出:

catalina.org.apache.juli.FileHandler.level = OFF


设置catalina所有的日志消息均输出:

catalina.org.apache.juli.FileHandler.level = ALL


Log4j日志框架替换Tomcat缺省采用的java.util.logging日志框架,步骤如下


    a.  创建log4j配置文件log4j.properties ,保存在$CATALINA_HOME/lib 下。

    b. 下载log4j.jar、tomcat-juli-adapters.jar、tomcat-juli.jar(下载地址:从Apache官网Log4J项目下载Log4J(1.2版本以后),从Apache官网Tomcat项目下载tomcat-juli.jar和tomcat-juli-adapters.jar。)

    c.  复制log4j.jar、tomcat-juli-adapters.jar到$CATALINA_HOME/lib下,

         用tomcat-juli.jar覆盖$CATALINA_HOME/bin下的同名文件。

    d.  删除Tomcat的缺省日志配置文件$CATALINA_HOME/conf/ logging.properties,以避免生成一些冗余的空日志文件。



2. server.xml的结构图


<Server>................................Server层

        <Service>............................Service层

                <Connector/>

                <Engine>..........................Engine层

                        <Host>.........................Host层

                                <Context/>...............Context层

                        </Host>

                </Engine>

        </Service>

<Server>


Server层

    对应Server组件,表示整个Tomcat(Catalina Servlet容器),它处于Tomcat顶层,可以包含一个或多个Service层。


Service层

    对应Service组件,是Server层中的一个逻辑功能层,包含一个Engine层,以及一个或多个Connector,Service组件将一个或多个Connector组件绑定到Engine层上,Connector组件侦听端口,获得用户请求,并将请求转发到Engine层处理,同时把处理结果转发给用户,从而实现一个特定的功能。


Engine层

    对应Engine组件,负责请求分发处理,可以连接多个Connector,它从Connector接收请求后,解析出可以完成用户请求的URL,根据URL可以把请求匹配到正确的Host上,当Host处理完用户请求后,Engine层把结果返回给适合连接器,再由连接器传输给用户。


Host层

    对应Host组件,表示一个虚拟主机,一个Engine层可以包含多个Host层,每个Host层可以包含一个或多个Context层,对应不同的web应用。


Context层

    对应Context组件,代表某个虚拟主机上的实际目录或一个WAR,即单个Web应用程序,它运行在特定的虚拟主机中,使用最为频繁。一个Host层包含多个Context层,每一个Context都有唯一的路径,Host层接到请求后,根据用户请求的URL,将请求定位到Context层。



3. server.xml配置详解
<?xml version='1.0' encoding='utf-8'?>

<!--每个tomcat的server.xml中只有这么一个Server结点,属于顶层类元素,旗下主要元素是service-->
<Server port="8005" shutdown="SHUTDOWN">
    < Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <!-- 安全监听器. Documentation at /docs/config/listeners.html
    < Listener className="org.apache.catalina.security.SecurityListener" />
    -->
    <!--APR library loader. Documentation at /docs/apr.html -->
    < Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
     <!-- 防止内存泄露 java/javax APIs-->
    < Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    < Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    < Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

     <!-- 配置全局JNDI-->
     <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
     </GlobalNamingResources>

     <!--Service旗下主要有两个非常重要的元素结点:Connector(连接器)和Engine(引擎)-->
    < Service name="Catalina">
         <!--连接器主要有两类:HTTP Connector 和 JK Connector
               第一个主要是用来直接接收web HTTP请求的
               第二个主要是用来接收其他HTTP服务器转发过来的客户请求
        -->
        <!--1. 普通 HTTP/1.1 协议的 Connector,这个是最常用的连接器, 它是用来接受客户请求的,可以在这个元素里面配置超时,重定向等等-->
        < Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
         <!--安全的 SSL HTTP/1.1协议的 Connector,这个和上一个普通HTTP/1.1的Connector不能同时存在-->
        <!--
        <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" />
        -->
         <!--2. AJP/1.3协议的 Connector,这个是用来处理Apache服务器转发过来的web客户请求-->
        < Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

         <!--这个 Engine 不清楚 啥作用-->
        <!-- You should set jvmRoute to support load-balancing via AJP ie :
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
        -->
         <!--3. 引擎是用来处理同一个<Service>下面所有的<Connector>接收到的客户端请求,引擎旗下最重要的结点是虚拟主机即:Host-->
        < Engine name="Catalina" defaultHost="localhost">
            
             <!--配置tomcat集群请参考如下文档
                /docs/cluster-howto.html  (simple how to)
                /docs/config/cluster.html (reference documentation) -->
            <!--集群类名
            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
            -->

             <!-- 配置LockOutRealm,防止暴力破解用户密码 -->
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                       resourceName="UserDatabase"/>
            </Realm>
            
            <!--4. 虚拟主机Host-->
            <!--Host可以配置的元素:
                  className: 指定实现org.apache.catalina.Host接口的类,默认是org.apache.catalina.core.StandarHost
                  appBase: 指定虚拟机的主目录,可以使绝对路径也可以是相对于<CATALINA_HOME>的相对路径, 默认是 <CATALINA_HOME>/webapps
                  uppackWARs: 设置为true时,表示tomcat服务器会先把web应用解压位目录后在运行,如果设置为false则将直接运行war文件
                  autoDeploy: 设置位true时,表示当tomcat处于运行状态时能够监测appBase目录下的文件如果有新的web应用加入,tomcat会自动发布这个应用
                  alias: 虚拟主机的别名,可以设置多个。
                deployOnStartup: 默认为true,设置为true时表示tomcat启动时会自动发布appBase下的所有的Web应用,如果应用没有在server.xml配置相应的<Context>元素,将会采用默认的Context。
                name: 虚拟主机的名字               
            -->
            < Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
                
            <!--5.  Context 的配置属性解释:
                    path:web应用的访问URL入口
                    reloadable: 设置位true时,tomcat服务器运行时会监控WEB_INF/classes 和WEB_INF/lib下的文件改动,如果class文件被更新,服务器会自动重启重新加载Web应用。
                    cookies: 指定是否通过Cookies来支持Session,默认为true
                    useNaming: 指定是否支持JNDI,默认为true
                -->
                 <Context path="/officeOA" docBase="webApp文件路径" debug="0" reloadable="true" crossContext="true" workDir="路径" cookies="true" useNaming="true">
                 <!-- SingleSignOn 共享认证,详细参考
                     Documentation at: /docs/config/valve.html -->
                <!--
                <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
                -->
                <!-- Access log processes all example.
                     Documentation at: /docs/config/valve.html
                     Note: The pattern used is equivalent to using pattern="common" -->
                <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" />

            </Host>
        </Engine>
    </Service>
</Server>

4. Tomcat优化

概要:tomcat优化配置主要是优化 两个节点的配置:一个是优化并发能力,通过配置连接器Connector,另一个是优化访问IP,即不通过IP来访问,而是通过域名来访问,这个主要是设置虚拟主机Host。

A: 连接器的配置详解:

Connector基本配置方案

    1.参数说明

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75

acceptCount:允许的最大连接数,应大于等于 maxProcessors ,默认值为 100

enableLookups:是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false

connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为30000 毫秒。

其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。

web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是1000 个左右。

        2.Tomcat中的配置示例

Xml代码
      1. <Connector port="9027"   
      2.   
      3.                 protocol="HTTP/1.1"  
      4.   
      5.                 maxHttpHeaderSize="8192"  
      6.   
      7.                 minProcessors="100"  
      8.   
      9.                 maxProcessors="1000"  
      10.   
      11.                 acceptCount="1000"  
      12.   
      13.                 redirectPort="8443"  
      14.   
      15.                 disableUploadTimeout="true"/>  

调整连接器connector的并发处理能力方案

1.参数说明

maxThreads  客户请求最大线程数

minSpareThreads    Tomcat初始化时创建的 socket 线程数

maxSpareThreads   Tomcat连接器的最大空闲 socket 线程数

enableLookups      若设为true, 则支持域名解析,可把 ip 地址解析为主机名

redirectPort        在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口

acceptAccount       监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads  )

connectionTimeout   连接超时

minProcessors         服务器创建时的最小处理线程数

maxProcessors        服务器同时最大处理线程数

URIEncoding    URL统一编码

2.Tomcat中的配置示例 

Xml代码
    1. <Connector port="9027"   
    2.   
    3.                 protocol="HTTP/1.1"  
    4.   
    5.                 maxHttpHeaderSize="8192"  
    6.   
    7.                 maxThreads="1000"  
    8.   
    9.                 minSpareThreads="100"  
    10.   
    11.                 maxSpareThreads="1000"  
    12.   
    13.                 minProcessors="100"  
    14.   
    15.                 maxProcessors="1000"  
    16.   
    17.                 enableLookups="false"  
    18.   
    19.                 URIEncoding="utf-8"  
    20.   
    21.                 acceptCount="1000"  
    22.   
    23.                 redirectPort="8443"  
    24.   
    25.                 disableUploadTimeout="true"/>  

Tomcat缓存优化方案

1.参数说明

compression 打开压缩功能   

compressionMinSize   启用压缩的输出内容大小,这里面默认为2KB

compressableMimeType 压缩类型

connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

2.Tomcat中的配置示例

Xml代码   收藏代码
  1. <Connector port="9027"   
  2.   
  3.                 protocol="HTTP/1.1"  
  4.   
  5.                 maxHttpHeaderSize="8192"  
  6.   
  7.                 maxThreads="1000"  
  8.   
  9.                 minSpareThreads="100"  
  10.   
  11.                 maxSpareThreads="1000"  
  12.   
  13.                 minProcessors="100"  
  14.   
  15.                 maxProcessors="1000"  
  16.   
  17.                 enableLookups="false"  
  18.   
  19.                 compression="on"  
  20.   
  21.                 compressionMinSize="2048"                 
  22.   
  23.                 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"  
  24.   
  25.                 connectionTimeout="20000"  
  26.   
  27.                 URIEncoding="utf-8"  
  28.   
  29.                 acceptCount="1000"  
  30.   
  31.                 redirectPort="8443"  
  32.   
  33.                 disableUploadTimeout="true"/>  
 
B 虚拟主机Host配置详解

有3个web项目,都已打成了war包,分别是aaa.war、bbb.war、ccc.war。

打算配置3个tomcat虚拟主机,分别绑定域名aaa.com、bbb.com、ccc.com。

 

配置方法如下:

 

1、在tomcat安装目录,与目录平级的地方,建立3个文件夹,分别是webapps_1/war、webapps_2/war、webapps_3/war,把3个war包分别放入3个war文件夹中。

这里不可以使用tomcat自带的webapps目录,不可以把3个war包放入同一个webapps文件夹,否会导致tomcat加载多次web项目(本例是3次),造成重复启动。

 

2、修改sever.xml,内容如下:

Xml代码
  1. <Engine name="Catalina" defaultHost="wwww.aaa.com">  
  2.     <Host name="www.aaa.com" appBase="webapps_1" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">  
  3.       <Alias>aaa.com</Alias>              
  4.       <Context path="/" docBase="./war/aaa.war" reloadable="true" />  
  5.     </Host>  
  6.     <Host name="www.bbb.com" appBase="webapps_2" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">  
  7.       <Context path="/" docBase="./war/bbb.war" reloadable="true" />  
  8.     </Host>  
  9.     <Host name="www.ccc.com" appBase="webapps_3" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">  
  10.       <Context path="/" docBase="./war/ccc.war" reloadable="true" />  
  11.     </Host>  
  12. </Engine>      

 

3、关键属性说明:

defaultHost="wwww.aaa.com" 的作用是,如果使用ip来访问,默认进入www.aaa.com网站。

name="www.aaa.com" 的作用是,为当前Host绑定域名www.aaa.com。

appBase="webapps_1"        的作用是,指定应用程序(网站)的基本路径 ,这里可以存放多个程序(网站)。一般是相对路径,相对于tomcat的安装目录。

<Alias>aaa.com</Alias>       的作用是,为一个Host,绑定多个域名。

<Context docBase="./war/aaa.war"    的作用是,aaa.war会被tomcat解包为aaa目录或ROOT目录(具体哪个目录取决于后面的 path参数),docBase作用就是指向aaa目录,这里是相对路径,是相对于前面指定的webapps_1目录。也可以是绝对路径。这里如果不使用子目录,会导致应用程序被启动两次。

<Context path="/"  的作用是,指定 Web应用的 上下文根,本例是Web应用的 上下文根是 /。


windows环境(tomcat6.0.18):如果设置为path="",tomcat会在webappa_1目录中自动生成ROOT目录(里面有还有与aaa目录一样一样的内容),要设置为path=""。

Linux环境(tomcat6.0.33):如果设置为path="",tomcat会在webappa_1目录中自动生成ROOT目录。而是生成 aaa目录。要设置为path="/"。(有待试验,今天凌晨验证到关键时刻,试验环境出问题了,未继续)。

 

4、运行过程

tomcat启动时,解压webapps_1/war/aaa.war包到webapps_1/ROOT目录中。


5. 在tomcat下部署项目

       在tomcat下部署项目主要有如下三种方式:
       第一种:直接拷贝。将项目下的WebRoot文件夹复制到$CATALINA_HOME\webapps路劲下,命名为qyzygl,启动服务即可,这种方式非常简单,也是想我这样的初学者经常用到的方式。访问地址如下:
http://localhost:8080/qyzygl
       第二种:这种方式并不需要将项目拷贝到webapps路径下,可以直接F:/路径下部署。方法如下:更改$CATALINA_HOME\conf\server.xml文件,在<host>标签内添加<Context>标签,内容如下:<Context docBase="D:/creator/workspace/qyzygl/WebRoot" reloadable="false" path="/ qyzygl "/>。其中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载,这个属性在开发阶段通常都设为true,方便开发,在发布阶段应该设置为false,提高应用程序的访问速度。docBase为路径,可以使用绝对路径,也可以使用相对路径,相对路径相对于webapps。 path属性的值是访问时的根地址。访问地址如下: http://localhost:8080/qyzygl  
       第三种:CATALINA_HOME\conf\Catalina\localhost中添加一个xml文件,如qyzygl.xml,内容如下:<Context docBase="F:/qyzygl" reloadable="false" />大家可能发现和第二种方式差不多,但是缺少了path属性,这种方式服务器会使用.xml的名字作为path属性的值。访问地址如下:
http://localhost:8080/qyzygl/
       第四种:使用.war文件包
       其实前面三种我们一直都是将qyzygl文件部署在服务器中,其实我们可以将应用程序打包成.war包,然后再部署在服务器上。打包步骤如下:
       打开cmd命令提示符。
       在命令提示框中进入D:/creator/workspace/qyzygl文件中,然后输入如下命令:jar cvf qyzygl.war */.然后提示框会出现非常多的类似于xxx写入之类的,这个过程就是在将qyzygl文件中的内容打包成.war文件,完成之后会在该目录下生成qyzygl.war文件。
       部署.war文件非常简单,将.war文件拷贝到webapps文件路径下或者将docBase=” D:/creator/workspace/qyzygl/WebRoot”更改为docBase="F:\qyzygl.war"即可。重写启动服务就可以完成部署了。

你可能感兴趣的:(tomcat,并发,优化,HTTP服务器,虚拟主机)