博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tomcat学习随笔
阅读量:5987 次
发布时间:2019-06-20

本文共 10540 字,大约阅读时间需要 35 分钟。

    Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache Web服务器混淆,Apache Web Server是一个用C语言实现的HTTP web server;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的轻量级Web 应用服务器。

 

一,安装

1,配置jdk环境变量:

export JAVA_HOME=/opt/soft/jdk1.7.0_55/

export JRE_HOME=/opt/soft/jdk1.7.0_55/jre

export PATH=$PATH:/opt/soft/jdk1.7.0_55/bin

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib

2,tomact安装:

软件下载地址:http://tomcat.apache.org/,下载二进制的tar包,解压即可使用。

# cd /opt/soft

# tar xf apache-tomcat-7.0.54.tar.gz

# cd /opt/soft/apache-tomcat-7.0.54

二,tomcat7基本配置

1,目录结构

 /bin:脚本文件目录。

 /lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载)。

 /conf:存放配置文件,最重要的是server.xml。

 /logs:存放日志文件。

 /temp:Tomcat运行时候存放临时文件用的。

 /webapps:web应用发布目录。

 /work:Tomcat把各种由jsp生成的servlet文件放在这个目录下。删除后,启动时会自动创建。

2 ,配置文件

 server.xml:主要的配置文件。

 web.xml:缺省的web app配置,WEB-INF/web.xml会覆盖该配置。

 context.xml:全局的context配置,对所有host生效

3,启动

# bash startup.sh

4,当url中未明确指定文件名时并且目录中也没有tomcat指定的index文件时,列出相关目录下所有文件:

打开web.xml文件,找到如下配置,把false改成true,重启tomcat即可。

    <servlet>

        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

5,虚拟目录的配置的两种方法

1)打开server.xml文件,知道其中如下的配置:

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

        <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>

然后在Host域中添加类似如下配置即可:

        <Context path="/lee" docBase="/opt/www" debug="0" reloadable="true"></Context>

        <Context path="/jia" docBase="/opt/" debug="0" reloadable="true"></Context>

docBase:是项目文件夹的web-inf文件夹的上一层目录 

reloadable:是指可以重新加载,一般设置为true,方便使用,不需要经常重启Tomcat。 

2)在conf/Catalina/locahost(该目录可能需要手工创建)下新建一个文件abc.xml,注意文件名中的abc就表示虚拟目录的名称,所以不可随意命名,该文件的内容为: 

<Context docBase="/opt/" debug="0" reloadable="true"></Context>

这里的Context元素会被Engine名字为Catalina下的localhost主机下的所有web应用加载。

三,虚拟主机的配置

1,tomcat 7的xml配置文件server.xml通常在默认情况下,在<Engine></Engine>标签之间会有一个默认虚拟主机配置:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>

最简的server.xml格式为:

<Engine name="Catalina" defaultHost="ren">

    <Host name="ren"    appBase="renapps"/>

    <Host name="stimpy" appBase="stimpyapps"/>

</Engine>

Host就是虚拟主机的元素(标签)。默认虚拟主机的应用程序目录是指向tomcat目录下的webapps这个文件夹的,默认打开的应用是ROOT,即在浏览器中输入http://localhost:8080 打开的是ROOT这个Web应用。

2,自定义基于域名的虚拟主机

在第一个虚拟主机的结束标签后面添加:

      <Host name="www.mydomain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

    <Context docBase="/opt/www" path="/my" reloadable="true" />
      </Host>
      <Host name="www.domain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/opt/www" path="" reloadable="true" />
      </Host>

appBase设置成了docBase的上一级目录,在apps目录下的test文件夹才是存放web应用的地方。

配置完成后,重启tomcat使用配置生效。

每一个Host会在Catalina引擎下根据host的name创建对应的文件夹:

[root@yd_82_231 conf]# ls Catalina/

localhost/        www.domain.com/   

3,自定义基于端口的虚拟主机

虽然可以增加Connector来增加服务的端口,但是host中没有提供端口的选项,这样增加出来的端口和源端口是一样的虚拟主机设定,无法达到我们的要求。

单纯增加端口没有办法,那么我们可以增加service,举例如下:

<Server port="8005" shutdown="SHUTDOWN">

….省略了server的配置

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context path="/lee" docBase="/opt/www" debug="0" reloadable="true"></Context>
        <Context path="/jia" docBase="/opt/" debug="0" reloadable="true"></Context>
        <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>
      <Host name="www.mydomain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/opt/www" path="/my" reloadable="true" />
      </Host>
      <Host name="www.domain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/opt/www" path="" reloadable="true" />
      </Host>
    </Engine>
  </Service>

<!--##############这是第二个service##############-->
<Service name="Catalina2">
    <Connector port="8090" />
    <Engine name="Catalina2" defaultHost="localhost">
      <Logger className="org.apache.catalina.logger.FileLogger" />
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase" />
      <Host name="localhost" appBase="webapps2" />
    </Engine>
  </Service>

 

</Server>

增加的service可以分配自己的connector和host,只要和主service不冲突即可,然后重启tomcat。会发现自动生成了对应的engine目录和host目录:

[root@yd_82_231 conf]# pwd

/opt/soft/apache-tomcat-7.0.54/conf
[root@yd_82_231 conf]# ls
Catalina   catalina.policy      context.xml         server.xml        web.xml
Catalina2  catalina.properties  logging.properties  tomcat-users.xml

[root@yd_82_231 conf]# ls Catalina2/         

localhost

4,禁止和允许主机或ip地址的访问

      <Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="*.mycompany.com,www.yourcompany.com"/> 

        <Valve className="org.apache.catalina.valves.RemoteAddrValve"   deny="10.10.81.*"/>

        <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>

三,简单调优

1,禁用DNS查询

  当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。而DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。

操作:

修改server.xml文件中的enableLookups参数值: enableLookups="false"

2,调整线程数

    通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

  示例如下:

    <Connector port="80" protocol="HTTP/1.1"

        maxThreads="600" 最多运行线程数  

        minSpareThreads="100" 初始化创建的线程数

        maxSpareThreads="500"

          最多能创建的线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要socket线程.

        acceptCount="700" 指定当所有可以使用的处理请求的线程数都被使用时

          可以放到处理队列中的请求数,超过这个数的请求将不予处理

        connectionTimeout="20000"

        enableLookups="false"

        redirectPort="8443" />

3,设置session过去时间

  在\conf\web.xml中通过参数指定:(单位为分钟)

    <session-config>   

        <session-timeout>180</session-timeout>     

    </session-config> 

四,server.xml文件详解

wKiom1OEg3jhlikhAAL3ABxCGpU613.jpg

wKiom1OEg4vxk92FAAK-vsmdTxc537.jpg

wKioL1OEg2zBeVF9AAKh-dIvBwQ404.jpg

1,<Server>元素

它代表整个容器 ,Tomcat 实例的顶层元素 .org.apache.catalina.Server 接口来定义 .它包含一个<Service>元素. 并且它不能做为任何元素的子元素 

<Server port="8005" shutdown="SHUTDOWN" debug="0">

1)className指定实现 org.apache.catalina.Server接口的类. 默认值为org.apache.catalina.core.StandardServer

2)port指定 Tomcat监听shutdown 命令端口终止服务器运行时,必须在 Tomcat服务器所在的机器上发出

3)shutdown命令,该属性是必须的shutdown指定终止Tomcat服务器运行时,发给 Tomcat服务器的shutdown 监听端口的字符串该属性必须设置。

2,<Service>元素

该元素由 org.apache.catalina.Service接口定义, 它包含一个 <Engine>元素, 以及一个或多个<Connector>,这些Connector 元素共享用同一个 Engine元素

<Service name="Catalina">  

<Service name="Apache">

可以有多个service元素,每个service也可以监听自己的端口。
1>className
 指定实现 org.apahce.catalina.Service接口的类. 默认为org.apahce.catalina.core.StandardService

2>name定义 Service的名字

3,<Engine>元素

每个Service元素只能有一个 Engine元素. 元素处理在同一个<Service>中所有<Connector> 元素接收到的客户请求. org.apahce.catalina.Engine接口定义.

<Engine name="Catalina" defaultHost="localhost" debug="0">

1)className指定实现Engine 接口的类 ,默认值为StandardEngine

2)defaultHost指定处理客户的默认主机名 ,<Engine> 中的<Host>子元素中必须定义这一主机 
3)name
定义 Engine的名字。<Engine>可以包含如下元素 <Logger>, <Realm>, <Value>, <Host>

4,<Host>元素

它由Host接口定义一个Engine 元素可以包含多个 <Host>元素. 每个<Host>的元素定义了一个虚拟主机 .包含了一个或多个Web应用。

<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">

1)className指定实现Host 接口的类 .默认值为StandardHost

2)appBase指定虚拟主机的目录 ,可以指定绝对目录,也可以指定相对于 <CATALINA_HOME>的相对目录. 如果没有此项 ,默认为<CATALINA_HOME>/webapps

3)autoDeploy如果此项设为 true,表示Tomcat服务处于运行状态时 ,能够监测appBase下的文件 ,如果有新有web应用加入进来,会自运发布这个 WEB应用

4)unpackWARs如果此项设置为 true,表示把WEB 应用的WAR文件先展开为开放目录结构后再运行 .如果设为false将直接运行为WAR文件 

5)alias指定主机别名 ,可以指定多个别名

6)deployOnStartup如果此项设为 true,表示Tomcat 服务器启动时会自动发布 appBase目录下所有的Web应用。如果Web 应用中的 server.xml没有相应的<Context> 元素,将采用 Tomcat默认的Context。即全局的context.xml配置,对所有host生效。

7)name定义虚拟主机的名字<Host>元素中可以包含如下子元素 <Logger>, <Realm>, <Value>,<Context>

5,<Context>元素

它由Context接口定义是使用最频繁的元素。每个<Context>元素代表了运行在虚拟主机上的单个 Web应用。一个<Host>可以包含多个 <Context>元素. 每个web应用有唯一的一个相对应的Context代表web应用自身servlet容器为第一个web应用创建一个 ServletContext对象。

<Context path="/sample" docBase="sample" debug="0" reloadbale="true">

1)className指定实现Context 的类,默认为 StandardContext

2)path指定访问 Web应用的URL 入口,注意 /myweb,而不是myweb 了事
3)reloadable
如果这个属性设为 true, Tomcat服务器在运行状态下会监视在 WEB-INF/classesWeb-INF/lib目录CLASS 文件的改运 .如果监视到有class文件被更新 ,服务器自重新加载Web应用 

3)cookies指定是否通过 Cookies来支持Session, 默认值为 true

4)useNaming指定是否支持 JNDI,默认值为了true<Context> 元素中可以包含如下元素 <Logger>,<Realm>, <Resource>, <ResourceParams>

6,<Connector>元素

Connector接口定义 .<Connector>元素代表与客户程序实际交互的给件 ,它负责接收客户请求,以及向客户返回响应结果。

<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75"  

 enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" 
 connectionTimeout="20000" disableUploadTimeout="true" />
 <Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" 
 protocol="AJP/1.3" />

第一个Connector元素定义了一个 HTTP Connector,它通过8080 端口接收 HTTP请求; 

第二个Connector元素定义了一个 JD Connector,它通过8009 端口接收由其它服务器转发过来的请求。

Connector元素共用属性 

1)className指定实现 Connector接口的类

2)enableLookups如果设为 true,表示支持域名解析,可以把 IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为 true

3)redirectPort指定转发端口 .如果当前端口只支持non-SSL请求 ,在需要安全通信的场命,将把客户请求转发至SSL redirectPort端口

7,HttpConnector元素的属性

1)className实现 Connector的类

2)port设定 Tcp/IP端口, 默认值为 8080,如果把8080 改成80,则只要输入  即可
因为TCP/IP的默认端口是 80
3)address
如果服务器有二个以上 ip地址, 此属性可以设定端口监听的 ip地址. 默认情况下 ,端口会监听服务器上所有的 ip地址

4)bufferSize设定由端口创建的输入流的缓存大小 .默认值为2048byte

5)protocol设定 Http协议, 默认值为 HTTP/1.1

6)maxThreads设定在监听端口的线程的最大数目 ,这个值也决定了服务器可以同时响应客户请求的最大数目。默认值为200。

7)acceptCount设定在监听端口队列的最大客户请求数量 ,默认值为10. 如果队列已满 ,客户必须等待.

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

8,JkConnector的属性 

1)className实现 Connector的类

2)port设定 AJP端口号
3)protocol
必须设定为 AJP/1.3

本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/1417887,如需转载请自行联系原作者
你可能感兴趣的文章
jboss启动报错
查看>>
程序员究竟该如何提高效率
查看>>
转面试题:跑灯
查看>>
spring mvc 单元测试
查看>>
swift与Objective-C的互用性
查看>>
Linux 进程管理
查看>>
Linux 线程相关函数理解
查看>>
我的友情链接
查看>>
2.3.1.shell awk 入门
查看>>
snmp在网络中的应用
查看>>
git 使用过程中问题记录
查看>>
SDN in Action: Deploy VXLAN with MP-BGP EV_P_N
查看>>
Maven学习总结(八)——使用Maven构建多模块项目
查看>>
Docker镜像与容器命令
查看>>
Java培训-日期类
查看>>
项目范围管理论文提纲
查看>>
python给qq发邮件
查看>>
关于mysql的 qps tps
查看>>
bootstrap datetimepicker 添加清空按钮
查看>>
Json学习总结(1)——Java和JavaScript中使用Json方法大全
查看>>