Tomcat 使用和配置文件(详解)

一.tomcat 介绍

1. tomcat 概述

自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持 Servlet,这样Tomcat就诞生了。Tomcat 是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的 servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的 喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。

2.tomcat 历史

Tomcat 最初由Sun公司的软件架构师 James Duncan Davidson 开发,名称为"JavaWebServer"。

1999年,在 Davidson 的帮助下,该项目于1999年于apache软件基金会旗下的JServ项目合并,并发布第一个版本(3.x),即是现在的Tomcat,该版本实现了Servlet2.2和JSP 1.1规范 。

2001年,Tomcat 发布了4.0版本, 作为里程碑式的版本,Tomcat 完全重新设计了其架构,并实现了Servlet 2.3和JSP 1.2规范。

目前 Tomcat 已经更新到 10.0.x版本,但是目前企业中的Tomcat服务器,主流版本还是7.x 和 8.x,所以本课程是基于 8.5 版本进行讲解。

二.tomcat 实例安装

2.1. 环境准备

  • 虚拟机的版本:VMware-workstation-full-15.5.6-16341506.exe
  • 系统镜像版本:CentOS-6.10-x86_64-bin-DVD1.iso,全新安装,桌面版,可上网
  • 系统内存大小:1GB
  • 系统硬盘大小:20GB
  • 连接工具版本:SecureCRTSecureFX_HH_x64_7.0.0.326.zip

2.2. tomcat下载

复制代码
mv apache-tomcat-8.5.57 /usr/local/tomcat

wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz

2.3. tomcat解压

复制代码
tar -zxvf apache-tomcat-8.5.57.tar.gz

2.4. tomcat 安装

复制代码
mv apache-tomcat-8.5.57 /usr/local/tomcat

2.5. tomcat 启动

注意:Tomcat启动需要Java环境,我这里是已经安装好的,Java环境安装不再本章之中!

启动 tomcat :

复制代码
/usr/local/tomcat/bin/startup.sh

关闭防火墙:

复制代码
service iptables stop
chkconfig iptables off

在浏览器输入:http://192.168.239.144:8080/

2.6. tomcat关闭

复制代码
/usr/local/tomcat/bin/shutdown.sh

三.Tomcat 配置文件详解

3.1. server.xml 详解

server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置。

3.1.1. Server

Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer。

复制代码
<Server port="8005" shutdown="SHUTDOWN">
...
</Server>

标签属性和子元素:

  • port:Tomcat 监听的关闭服务器的端口。
  • shutdown:关闭服务器的指令字符串。
  • Server内嵌的子元素为 Listener、GlobalNamingResources、Service。

3.1.2. Listener

默认配置的5个Listener的含义:

复制代码
<!‐‐ 用于以日志形式输出服务器 、操作系统、JVM的版本信息 ‐‐>
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />

<!‐‐ 用于加载(服务器启动) 和 销毁 (服务器停止) APR。 如果找不到APR库, 则会输出日志, 并不影响Tomcat启动 ‐‐>
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

<!‐‐ 用于避免JRE内存泄漏问题 ‐‐>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

<!‐‐ 用户加载(服务器启动) 和 销毁(服务器停止) 全局命名服务 ‐‐>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

<!‐‐ 用于在Context停止时重建Executor 池中的线程, 以避免ThreadLocal 相关的内存泄漏 ‐‐>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

3.1.3、GlobalNamingResources

GlobalNamingResources中定义了全局命名服务:

复制代码
<GlobalNamingResources>
	<!‐‐ 可编辑的用户数据库,UserDatabaseRealm也可以使用该数据库对用户进行身份验证 ‐‐>
	<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>

3.1.4、Service

该元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。默认情况下,Tomcat 仅指定了Service 的名称, 值为 "Catalina"。Service 可以内嵌的元素为 : Listener、Executor、Connector、Engine,其中 : Listener 用于为Service添加生命周期监听器, Executor 用于配置Service 共享线程池,Connector 用于配置Service 包含的链接器, Engine 用于配置Service中链接器对应的Servlet 容器引擎。一个Server服务器,可以包含多个Service服务。

复制代码
<Service name="Catalina"> 
... 
</Service>

3.1.5、Executor

默认情况下,Service 并未添加共享线程池配置。 如果我们想添加一个线程池, 可以在 下添加如下配置:

复制代码
<Executor   name="tomcatThreadPool" 
			namePrefix="catalina‐exec‐" 
			maxThreads="200" 
			minSpareThreads="100" 
			maxIdleTime="60000" 
			maxQueueSize="Integer.MAX_VALUE" 
			prestartminSpareThreads="false" 
			threadPriority="5"
			className="org.apache.catalina.core.StandardThreadExecutor" />

标签属性和子元素:

  • name:线程池名称,用于Connector中指定。
  • namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。
  • maxThreads:池中最大线程数。
  • minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
  • maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
  • maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改, 否则会有请求不会被处理的情况发生。
  • prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。 默认值为false,即不启动。
  • threadPriority:线程池中线程优先级,默认值为5,值从1到10。
  • className:线程池实现类,未指定情况下,默认实现类为 org.apache.catalina.core.StandardThreadExecutor。 如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。

3.1.6、Connector

Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置, 只是根据需要对已有链接器进行优化。

复制代码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

标签属性和子元素:

  • port:端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector使用。

  • protocol:当前Connector 支持的访问协议。 默认为 HTTP/1.1,并采用自动切换机制选择一个基于 JAVA NIO 的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat的本地库判定)。如果不希望采用上述自动切换的机制, 而是明确指定协议, 可以使用以下值。

  • Http协议:

    org.apache.coyote.http11.Http11NioProtocol ,非阻塞式 Java NIO 链接器
    org.apache.coyote.http11.Http11Nio2Protocol ,非阻塞式 JAVA NIO2 链接器
    org.apache.coyote.http11.Http11AprProtocol ,APR 链接器

  • AJP协议:

    org.apache.coyote.ajp.AjpNioProtocol ,非阻塞式 Java NIO 链接器
    org.apache.coyote.ajp.AjpNio2Protocol ,非阻塞式 JAVA NIO2 链接器
    org.apache.coyote.ajp.AjpAprProtocol ,APR 链接器

  • connectionTimeout:Connector接收连接后的等待超时时间, 单位为毫秒。 -1 表示不超时。

  • redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合 security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口。

  • executor:指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads 等属性配置内部线程池。

  • URIEncoding:用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为UTF-8 , Tomcat7.x版本默认为ISO-8859-1。

  • maxThreads:池中最大线程数。

  • minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。

  • acceptCount:接收的连接数。

  • maxConnections:接收的最大连接数。

  • compression:是否压缩。

  • compressionMinSize:压缩的大小。

  • disableUploadTimeout:禁用上传超时。

完整的配置如下:

复制代码
<Connector  port="8080" 
			protocol="HTTP/1.1" 
			connectionTimeout="20000" 
			redirectPort="8443" 
			executor="tomcatThreadPool" 
			URIEncoding="UTF‐8"
			maxThreads="1000" 
			minSpareThreads="100" 
			acceptCount="1000" 
			maxConnections="1000" 
			compression="on" 
			compressionMinSize="2048"
			disableUploadTimeout="true" />

3.1.7、Engine

Engine 作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host。

复制代码
<Engine name="Catalina" defaultHost="localhost">
...
</Engine>

标签属性和子元素:

  • session-timeout: 会话超时时间,单位:分钟。

cookie-config:用于配置会话追踪Cookie。

  • name:Cookie的名称。

    domain:Cookie的域名。

    path:Cookie的路径。

    comment:Cookie的注释。

    http-only:Cookie只能通过HTTP方式进行访问,JS无法读取或修改,此项可以增 加网站访问的安全性。

    secure:此Cookie只能通过HTTPS连接传递到服务器,而HTTP连接则不会传递该信息。注意是从浏览器传递到服务器,服务器端的Cookie对象不受此项影响。

    max-age:以秒为单位表示cookie的生存期,默认为‐1表示是会话Cookie,浏览器 关闭时就会消失。

  • tracking-mode:用于配置会话追踪模式,Servlet3.0版本中支持的追踪模式: COOKIE、URL、SSL。

3.3.3、Servlet配置

Servlet 的配置主要是两部分, servlet 和 servlet-mapping :

复制代码
<servlet>
	<servlet-name>myServlet</servlet‐name>
	<servlet-class>com.caochenlei.MyServlet</servlet‐class>
	<init-param>
		<param-name>fileName</param‐name>
		<param-value>init.conf</param‐value>
	</init‐param>
	<load-on-startup>1</load‐on‐startup>
	<enabled>true</enabled>
</servlet>
<servlet-mapping>
	<servlet-name>myServlet</servlet‐name>
	<url-pattern>*.do</url‐pattern>
	<url-pattern>/myservet/*</url‐pattern>
</servlet‐mapping>

标签属性和子元素:

servlet:

  • servlet-name:指定servlet的名称, 该属性在web.xml中唯一。
  • servlet-class:用于指定servlet类名。
  • init-param:用于指定servlet的初始化参数, 在应用中可以通过 HttpServlet.getInitParameter 获取。
  • param-name:初始化参数名称。
  • param-value:初始化参数的值。
  • load-on-startup:用于控制在Web应用启动时,Servlet的加载顺序, 值小于0,web应用启动时,不加载该servlet,第一次访问时加载。
  • enabled:若为false,表示Servlet不处理任何请求。

servlet-mapping:

  • servlet-name:你想要让哪个servlet处理,这里就写哪个servlet名称。
  • url-pattern:用于指定URL表达式,一个 servlet‐mapping可以同时配置多个 url‐ pattern。

servlet 中文件上传配置:

复制代码
<servlet>
	<servlet-name>uploadServlet</servlet‐name>
	<servlet-class>com.caochenlei.UploadServlet</servlet‐class>
	<multipart-config>
		<location>C://path</location>
		<max-file-size>10485760</max‐file‐size>
		<max-request-size>10485760</max‐request‐size>
		<file-size-threshold>0</file‐size‐threshold>
	</multipart‐config>
</servlet>

标签属性和子元素:

  • multipart-config:上传的配置
  • location:存放生成的文件地址。
  • max-file-size:允许上传的文件最大值。 默认值为‐1, 表示没有限制。
  • max-request-size:针对该 multi/form‐data 请求的最大数量,默认值为‐1, 表示无限制。
  • file-size-threshold:当数量量大于该值时, 内容会被写入文件。

3.3.4、Listener配置

Listener用于监听servlet中的事件,例如context、request、session对象的创建、修改、删除,并触发响应事件。Listener是观察者模式的实现,在servlet中主要用于对context、request、session对象的生命周期进行监控。在servlet2.5规范中共定义了8中Listener。在启动时,ServletContextListener 的执行顺序与web.xml 中的配置顺序一致, 停止时执行顺序相反。

复制代码
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener‐class>
</listener>

标签属性和子元素:

  • listener-class:用于指定监听的类,该类必须实现Listener接口。

3.3.5、Filter配置

filter 用于配置web应用过滤器, 用来过滤资源请求及响应。 经常用于认证、日志、加密、数据转换等操作, 配置如下:

复制代码
<filter>
	<filter-name>myFilter</filter‐name>
	<filter-class>com.caochenlei.MyFilter</filter‐class>
	<async-supported>true</async‐supported>
	<init-param>
		<param-name>language</param‐name>
		<param-value>CN</param‐value>
	</init‐param>
</filter>
<filter-mapping>
	<filter-name>myFilter</filter‐name>
	<url-pattern>/*</url‐pattern>
</filter‐mapping>

标签属性和子元素:

filter:

  • filter-name:用于指定过滤器名称,在web.xml中,过滤器名称必须唯一。
  • filter-class:过滤器的全限定类名,该类必须实现Filter接口。
  • async-supported:该过滤器是否支持异步。
  • init-param:用于配置Filter的初始化参数, 可以配置多个, 可以通过FilterConfig.getInitParameter获取。
  • param-name:初始化参数名称。
  • param-value:初始化参数的值。

filter-mapping:

  • filter-name:这里指的是你想使用哪个过滤器进行过滤就写哪个过滤器的名称。
  • url-pattern:指定该过滤器需要拦截的URL。

3.3.6、欢迎页面配置

welcome-file-list 用于指定web应用的欢迎文件列表。尝试请求的顺序,从上到下。

复制代码
<welcome-file-list>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.htm</welcome-file>
	<welcome-file>index.jsp</welcome-file>
	<welcome-file>default.html</welcome-file>
	<welcome-file>default.htm</welcome-file>
	<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

3.3.7、错误页面配置

error-page 用于配置Web应用访问异常时定向到的页面,支持HTTP响应码和异常类两种形式。

复制代码
<error-page>
	<error-code>404</error‐code>
	<location>/404.html</location>
</error‐page>
<error-page>
	<error-code>500</error‐code>
	<location>/500.html</location>
</error‐page>
<error-page>
	<exception-type>java.lang.Exception</exception‐type>
	<location>/error.jsp</location>
</error‐page>

四.tomcat 目录

  1. bin :存放各种平台下启动和关闭Tomcat的脚本文件。其中有个档是catalina.bat,打开这个windos配置文件,在非注释行加入JDK路径,例如 : SET JAVA_HOME=C:j2sdk1.4.2_06 保存后,就配置好tomcat环境了。 startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件。

  2. conf :存放不同的配置文件(server.xml和web.xml);tomcat启动的时候需要读取的配置文件:server.xml(tomcat主要配置文件)、web.xml和tomcatat-users.xml、catalina.policy(安全策略文件)等。修改了以后需要重启tomcat才能生效.最重要的是 server.xml;配置tomcat组件的XML文件server.XML其中包括:

I.顶层类元素Top Level Elements: 位于整个配置文件的顶层, 包括和;

II.连接器类元素Connectors : 客户和服务(容器类元素)间的通讯接口。接受客户请求,返回响应结果;

II.容器类元素Containers: 处理客户请求并且生成响应结果,包含3个:

IV.嵌套类元素Nested Components: 可以加入到容器中的元素,包括:

一个包含一个或多个,一个包含唯一一个和一个或多个,多个共享一个;一个包含多个,每个定义一个虚拟主机,包含一个或多个web应用; 元素是代表一个在虚拟主机上运行的Web应用。标签的描述

  1. Doc:存放 Tomcat文档;

  2. Common:存放Tomcat运行需要的库文件(JARS);

  3. logs:存放Tomcat执行时的LOG文件(日志文件);

  4. src: 存放Tomcat的源代码;(这个要看你下载的是何种tomcat啦)

  5. webapps:Tomcat的主要Web发布目录(包括应用程序示例);

  6. work:存放jsp编译后产生的class文件;

  7. temp : 临时活页夹,Tomcat运行时候存放临时文件用的。

tomcat 类加载

Bootstrap($JAVA_HOME/jre/lib/ext/*.jar) 其实直接双击该jar也会使得tomcat运行起来。

System($CLASSPATH/*.class和指定的jar)

Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)

Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)

&Shared(CATALINA_HOME/shared/下的classes和lib目录以及CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)

加载类和资源的顺序为:

1、/Web-INF/classes

2、/Web-INF/lib/*.jar

3、Bootstrap

4、System

5、$CATALINA_HOME/common/classes

6、$CATALINA_HOME/common/endores/*.jar

7、$CATALINA_HOME/common/lib/*.jar

8、$CATALINA_HOME/shared/classes

9、$CATALINA_HOME/shared/lib/*.jar

相关推荐
碳基硅坊10 小时前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
黄毛火烧雪下10 小时前
Java 核心知识点总结(一)
java·开发语言
凡人叶枫10 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发
技术小结-李爽10 小时前
【工具】Maven的下载、安装、使用
java·maven
AI帮小忙11 小时前
Debian系linux操作系统里安装OpenClaw
linux·运维·debian
极创信息11 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
努力成为AK大王11 小时前
并发编程的核心挑战、优化方案与核心知识点总结
java·开发语言·数据库
云烟成雨TD11 小时前
Agent Scope Java 2.x 系列【10】技能(Skill)
java·人工智能·agent
摇滚侠11 小时前
SpringMVC 入门到实战 DispatcherServlet 源码解读 92-95
java·后端·spring·maven·intellij-idea
键盘歌唱家11 小时前
Spring AI 入门分享:它和“直接调 API“到底差在哪
java·人工智能·spring