tomcat的核心配置在conf/server.xml中。


<Server>   根元素

<Server>即Catalina Servlet组件。

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

常用属性

  • Address—Tomcat监听shutdown命令的地址,默认为localhost
  • className—指定实现org.apache.catalina.Server接口的类,默认值为org.apache.catalina.core.StandardServer
  • port-Tomcat监听shutdown命令的端口。设置为-1,则禁止通过端口关闭Tomcat,同时shutdown.bat也不能使用
  • shutdown-通过指定的地址(Address)、端口(port)关闭Tomcat所需的字符串。

远程关闭tomcat示例

启用Telnet:(Telnet是windows自带的与其它主机通信的程序)

win+s,输入telnet,匹配“启用或关闭windows功能”,回车,勾选telent

命令行输入  telnet  启动Telnet

输入 telnet localhost 8005 连接到指定主机(此处为本地主机)

输入 SHUTDOWN 即可关闭Tomcat

输入 quit 可退出Telnet

<Server>有3个子元素:<Listener>、<GlobalNamingResources>、<Service>。


<Listener>

Listener即监听器,负责监听特定的事件,当特定事件触发时,Listener会捕捉到该事件,并做出相应处理。

Listener通常用在Tomcat的启动和关闭过程,可嵌在Server、Engine、Host、Context内。

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. 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" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

常用属性:

  • className-指定org.apache.catalina.LifecycleListener接口的实现类

<GlobalNamingResources>

GlobalNamingResources用于配置JNDI,默认只加载conf/tomcat-users.xml中的用户配置。

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

<Service>包含<Executor>、<Connector>、<Engine>3个组件|子元素,组成一个完整的服务。一个<Server>可以包含多个<Service>。

  <Service name="Catalina">
    <Executor />
   <Connector />
   <Engine></Engine>
</Service>

常用属性:

  • name—<Service>的名字,需唯一
  • className—指定org.apache.catalina. Service接口的实现类,默认值为org.apache.catalina.core.StandardService

<Service>的子元素

(1)<Executor>

Executor即Service提供的线程池,供Service内各组件使用。

    <!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="" minSpareThreads=""/>
-->

这个是tomcat提供的配置示例,并不是默认配置。

常见属性:

  • name-线程池的名称
  • className-指定实现org.apache.catalina. Executor接口的类,默认值为org.apache.catalina.core. StandardThreadExecutor
  • daemon-线程池内的线程是否为守护线程,默认值为true
  • threadPriority  线程池内线程的优先级,默认值5
  • namePrefix-线程名的前缀。线程名通常为namePrefix+ threadNumber
  • maxThreads-线程池内线程数上限,默认值200
  • minSpareThreads-线程池内线程数下限,默认值10
  • maxIdleTime-空闲线程的存活时间(单位:ms),默认值60000,即1min
  • maxQueueSize-线程池满的情况下会将请求放在队列中排队等待,此属性设置队列大小(可容纳的请求个数),默认值100,超过此值,将拒绝连接
  • prestartminSpareThreads-是否在Executor启动时,就生成minSpareThreads个线程。默认值false
  • threadRenewalDelay-重建线程的时间间隔。重建线程池内的线程时,为了避免线程同时重建,每隔threadRenewalDelay(单位:ms)重建一个线程。默认值1000,设置为负则不重建

<Executor>配置的线程池,是此<Service>中的所有<Host>(所有webapp)共享的。

(2)<Connector>

Connector负责与其它机器(客户端、其它服务器)的通信、建立连接。

    <Connector port="" protocol="HTTP/1.1"
connectionTimeout=""
redirectPort="" />

<!--
<Connector executor="tomcatThreadPool"
port="" protocol="HTTP/1.1"
connectionTimeout=""
redirectPort="" />
-->

<!--
<Connector port="" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->

<!--
<Connector protocol="AJP/1.3"
address="::1"
port=""
redirectPort="" />
-->

有两种:HTTP Connector和AJP Connector,分别是使用http协议建立http连接、使用ajp协议建立ajp连接。

HTTP Connector负责与客户端通信,AJP Connector负责与其它web容器(apache、其他tomcat)通信。

nginx+tomcat的架构模式使用http,用不上ajp,可以将ajp连接注释掉。

默认只配置了http请求,客户端以http://ip|host:8080/的方式请求tomcat。

如果要使用安全的http协议,需要取消https的注释,客户端就可以通过https://ip|host:8443/的方式请求tomcat,或者以https://ip|host:8080/来请求tomcat(https+8080),会自动重定向到8443端口(https)。https可以看做数据加密的http,使用的是BIO,安全但是效率低。

默认都是使用tomcat默认配置的线程池,可以用executor属性引用自己配置的线程池。

<Connector>的常用属性:

  • port-监听|接收请求的端口
  • protocol-使用的协议
  • connectionTimeout-连接超时时间,默认单位ms
  • redirectPort-如果对方以https向http的端口(默认8080)发起请求时,将请求重定向到https的端口(默认8443)
  • executor-指定线程池。也可以直接在<Connector>标签内设置maxThreads(默认200)、minSpareThreads(默认10)
  • acceptCount-Connector请求队列的上限,默认值100,超过100,将拒绝连接

(3)<Engine>

Engine负责处理所有的请求:接收来自Connector的请求,传给对应的Host处理,Host调用对应的Context(webapp)来处理,处理完将结果一级一级往上传。

一个<Service>内必须包含、且只能包含一个<Engine>,可以包含一个或多个<Connector>,这些<Connector>共用一个<Engine>。

    <!--
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
--> <Engine name="Catalina" defaultHost="localhost"> <!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->

<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">
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
     -->     <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>

<Engine>的常用属性:

  • name-Engine的名字
  • defaultHost-指定默认的Host。Engine接收来自Connector的请求,传给对应的Host来处理,如果找不到对应的host,就使用默认的host来处理。
  • className-指定实现org.apache.catalina. Engine接口的类,默认值为org.apache.catalina.core. StandardEngine
  • backgroundProcessorDelay-Engine及其部分子组件(Host、Context)调用backgroundProcessor方法的时间间隔,默认值10,负值表示不调用backgroundProcessor

  Tomcat启动后,Engine、Host、Context都会启动一个后台线程,定期调用backgroundProcessor方法

  backgroundProcessor方法主要用于重新加载Web应用程序的类文件和资源、扫描Session过期

  • jvmRoute-Tomcat集群节点的id,tomcat路由时使用此属性。

session共享

session原本是储存在tomcat服务器上的:

这次可能用tomcat1处理此用户的请求,此次的session数据保存在tomcat1上;

下次可能使用tomcat2处理此用户的请求,tomcat2在本机上找不到此用户的session数据(因为储存在tomcat1上),而这次产生的session数据保存在tomcat2上,tomcat1上的session数据没有更新。

数据不同步是分布式系统(集群、微服务)都会遇到的问题。

Tomcat集群,tomcat之间要共享session等数据,常见的做法有2种:

  • 使用redis,把要共享的数据都放到redis上(推荐)
  • 使用tomcat的路由|广播

tomcat路由

conf/server.xml中配置:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
   <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
   <!--其它配置-->
</Engine>

指定jvmRoute,指定路由的实现类。

jvmRoute相当于组名,会把jvmRoute值相同的tomcat划为一组,比如要使用session,会在这组tomcat中找到SessionId为xxx的所有Session,组合成一个完整的session来使用。

属性名中有jvm,是因为tomcat是运行在jvm上的(依赖jdk),session等数据实际都是在jvm中,相当于是jvm的路由。

使用redis做数据共享

把session等数据保存到redis上,而非tomcat本地,要用时从redis上取出。

遍历一组tomcat节点很花时间,尤其是session钝化后需要从硬盘加载,很花时间,比起redis这种内存数据库,性能差太多。

不推荐使用tomcat路由,尽量使用redis做数据共享。


<Engine>常见的子元素

1、<Cluster />

tomcat路由时使用

2、<Realm>

Realm可以理解为包含用户、密码、角色的”数据库”。

Tomcat定义了多种Realm实现:JDBC Database Realm、DataSource Database Realm、JNDI Directory Realm、UserDatabase Realm等。

     <Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>

默认只配置了UserDatabaseRealm,使用从conf/tomcat-users.xml中加载的tomcat用户信息。

3、<Host>

一个<Host>即一个虚拟主机,比如www.chy.com,需要在DNS上注册才可以正常使用(绑定ip),不然只能使用本地的localhost(对应ip127.0.0.1)。

一个tomcat上可以设置多个host,比如www.a.com、www.b.com都在一个tomcat上,对应一个ip,这是可以的。

可以配置多个<Host>,也可以在tomcat控制台 -> Host Manager中添加虚拟主机。

默认只设置了一个虚拟主机:

        <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
     -->     <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>

常用属性:

  • appBase-web项目的部署目录,默认值webapps
  • unpackWARs-如果appBase下有war包,是直接使用war包部署,还是先将war包解压,使用解压得到的文件夹来部署。

  unpack即不打包,默认为true——先解压,使用解压得到的文件夹来部署。

  • autoDeploy-是否开启自动部署,默认为true。

  开启自动部署的效果:tomcat会监听appBase下的文件|文件夹变化,放进来一个web项目时会自动部署,修改已部署的项目中的文件时会自动同步(重新部署)

  • startStopThreads-Tomcat启动|关闭时,此Host要使用几个线程来部署|卸载web应用。

  默认值1,部署|卸载webapp很慢,可以使用多个线程并行部署|卸载,减少tomcat的启动|关闭所需的时间。

  • name-Host的名字,即主机名,要对应域名

  比如主机名是localhost,那就只能以http://localhost:8080/来访问,因为域名都要转换为ip,所以可以在地址栏输入对应的ip。

  如果主机名是www.chy.com,那就要以http://www.chy.com:8080/来访问,需要在DNS上注册这个域名,将域名与ip绑定,才可以使用。

  当然本地模拟的话,在host文件中加一行:

192.168.1.6  www.chy.com

   把本机的ip加上去,开启tomcat,浏览器地址栏输入http://www.chy.com:8080也是可以的:

只能使用本机的实际ip,不能写127.0.01,因为127.0.0.1 <=> localhost是写死的,修改不了。

<Context>

一个<Context>即一个webapp的部署配置,一个<Host>中可以有多个<Context>。

<Context docBase="helloApp" path="/helloApp" debug="" reloadable="false"/>

常用属性:

  • docBase - 指定项目路径,相对于appBase,也可以使用绝对路径
  • path - 指定该webapp的映射地址

  比如映射为/test,就以http://ip|host:port/test来访问,/表示host的根目录。

  默认为/war包名,或/部署的文件夹名。

  • debug - 调试级别,值为0-9,数值越大,日志输出的调试信息越详细。
  • reloadable-是否监控此webapp的/WEB-INF/classes/和/WEB-INF/lib的变化,检测到变化时,会重新部署此webapp,同步改变。

  通常开发时设为true,方便调试;正式上线|发布则设为false,减轻服务器的负担、提高服务器性能。

  默认为false。

  • crossContext-是否将本webapp的session共享给同一host下的其它webapp,默认为false

  Context代表一个webapp,crossContext即数据穿过当前webapp,共享给同一host下的其它webapp。

tomcat默认没有设置<Context />,里面的属性均使用默认值。

<Valve>

Valve可以理解为Tomcat的拦截器,可以用于Tomcat的日志、权限等,可嵌在Engine、Host、Context内使用。

        <!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
--> <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下的其它webapp共享。

使用AccessLogValve记录此host处理的所有的请求的日志,每天的日志记录到一个新的文件中,

指定了日志文件目录、日志文件名的前缀、后缀,pattern指定日志格式。

<Value>同样可以使用debug属性设置调试级别。


session超时设置

conf/web.xml,搜索session:

  <!-- ==================== Default Session Configuration ================= -->
<!-- You can set the default session timeout (in minutes) for all newly -->
<!-- created sessions by modifying the value below. --> <session-config>
<session-timeout></session-timeout>
</session-config>

默认30min。


说明

Tomcat的操作手册即在webapps/docs,都是些html文档,可直接查看,也可启动tomcat,地址栏输入localhost:8080/docs查看。

tomcat的配置手册在webapps/docs/conf下。

也可以到tomcat官网查看文档。

Tomcat 核心配置的更多相关文章

  1. 详解Tomcat核心配置、http协议

    Tomcat服务器 Tomcat配置与部署(IDEA) https://www.cnblogs.com/gonghr/p/14731266.html Tomcat手工创建和打包第一个Web工程 在ap ...

  2. apache2 tomcat https配置-被忽悠进了CentOS 6

    因为需要让ios应用可以绕过appstore,要找个https的地方放ipa,决定使用已有http server. 首先需要说明的是,apache可以通过反向代理方式将用户的https分发到tomca ...

  3. Tomcat 安全配置与性能优化

    一.Tomcat内存优化 1.JAVA_OPTS参数说明 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OP ...

  4. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  5. 在Tomcat中配置连接池和数据源

    1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource ...

  6. Tomcat基本配置

    第二十六课 Tomcat基本配置 目录 一. Tomcat介绍 二. 安装jdk 三. 安装Tomcat 四. 配置Tomcat监听80端口 五. 配置Tomcat虚拟主机 六. Tomcat日志 七 ...

  7. centos tomcat/resin安装配置 卸载系统自带的java tomcat安装配置 安装JDK resin安装配置 第二十八节课

    centos  tomcat/resin安装配置  卸载系统自带的java  tomcat安装配置  安装JDK   resin安装配置    第二十八节课 tomcat和java都不需要编译 tom ...

  8. tomcat NIO配置

    1.tomcat NIO配置 今天在查看日志时发现tomcat的Socket连接方式为bio,于是我想既然有bio那肯定有nio.果然,一查就发现tomcat在6.0之后就可以配置nio的方式.nio ...

  9. Tomcat基础配置和高级配置

    **********  第一部分 Tomcat基础配置   *********** 一.Apatch Tomcat 在win下配置 大部分转载自:http://blog.csdn.net/liuhao ...

随机推荐

  1. 美食家App开发日记3

    由于个人原因,感觉Android的学习特别复杂,初次接触,实在难以完成最初设想,所以将最初的设想做减法. 今天学习了ListView控件,将图片和美食名字使用ListView界面显示出来,并学习提升L ...

  2. 进击.net 三大框架

    spring mybatis NHibernate

  3. 西柚考勤系统——alpha2

    这个作业属于哪个课程 http://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业的要求在哪里 https://www.cn ...

  4. 谈谈 InnoDB引擎中的一些索引策略

    如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...

  5. python接口自动化测试 - 数据驱动DDT模块的简单使用

    DDT简单介绍 名称:Data-Driven Tests,数据驱动测试 作用:由外部数据集合来驱动测试用例的执行 核心的思想:数据和测试代码分离 应用场景:一组外部数据来执行相同的操作 优点:当测试数 ...

  6. 云原生 - Istio可观察性之监控(四)

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  7. [白话解析] Flink的Watermark机制

    [白话解析] Flink的Watermark机制 0x00 摘要 对于Flink来说,Watermark是个很难绕过去的概念.本文将从整体的思路上来说,运用感性直觉的思考来帮大家梳理Watermark ...

  8. spring5.0源码项目搭建

    一.准备相应环境以及下载spring项目 Ps:此处只讲解安装gradle 1.JDK安装 2.Idea安装 3.gradle安装 Gradle下载路径:https://services.gradle ...

  9. Java中的代码点与代码单元

    在Java中,什么是代码点与代码单元? 代码点(Code Point):在 Unicode 代码空间中的一个值,取值 U+0000 至 U+10FFFF,代表一个字符. 其中U+0000到U+FFFF ...

  10. Java 继承_Chris

    题目: 编写一个应用程序,创建一个矩形类,类中具有长.宽两个成员变量和求周长的方法.再创建一个矩形类的子类——正方形类,类中定义求面积方法.重写求周长的方法.在主类中,输入一个正方形边长,创建正方形对 ...