Tomcat架构设计原理是什么?博学谷狂野架构师一文
- 内容介绍
- 文章标签
- 相关推荐
本文共计2486个文字,预计阅读时间需要10分钟。
Tomcat架构及项目结构解析,bin目录主要存放Tomcat的启动命令。主要分为两大类:一类是以.sh结尾的Linux命令,另一类是以.bat结尾的Windows命令。包含多个环境变量设置。
Tomcat体系架构
Tomcat项目结构
bin目录
bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。
很多环境变量的设置都在此处,例如可以设置JDK路径、tomcat路径
- startup文件:主要是检查catalina.bat/sh 执行所需环境,并调用catalina.bat 批处理文件。启动tomcat。
- catalina文件:真正启动Tomcat文件,可以在里面设置jvm参数。后面性能调优会重点讲
- shutdown文件:关闭Tomcat
- 脚本version.sh、startup.sh、shutdown.sh、configtest.sh都是对catalina.sh的包装,内容大同小异,差异在于功能介绍和调用catalina.sh时的参数不同。
- Version:查看当前tomcat的版本号,
- Configtest:校验tomcat配置文件server.xml的格式、内容等是否合法、正确。
- Service:安装tomcat服务,可用net start tomcat 启动
conf目录
conf目录主要是用来存放tomcat的一些配置文件。
- server.xml:可以设置端口号、设置域名或IP、默认加载的项目、请求编码
- web.xml:可以设置tomcat支持的文件类型
- context.xml:可以用来配置数据源之类的
- tomcat-users.xml:用来配置管理tomcat的用户与权限
- 在Catalina目录下可以设置默认加载的项目
server.xml
COPY<?xml version="1.0" encoding="UTF-8"?> <!-- Server代表一个 Tomcat 实例。可以包含一个或多个 Services,其中每个Service都有自己的Engines和Connectors。 port="8005"指定一个端口,这个端口负责监听关闭tomcat的请求 --> <Server port="8005" shutdown="SHUTDOWN"> <!-- 监听器 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- 全局命名资源,定义了UserDatabase的一个JNDI(java命名和目录接口),通过pathname的文件得到一个用户授权的内存数据库 --> <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它包含一个<Engine>元素,以及一个或多个<Connector>,这些Connector元素共享用同一个Engine元素 --> <Service name="Catalina"> <!-- 每个Service可以有一个或多个连接器<Connector>元素, 第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定 义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求. --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- 每个Service只能有一个<Engine>元素 --> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- 默认host配置,有几个域名就配置几个Host,但是这种只能是同一个端口号 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Tomcat的访问日志,默认可以关闭掉它,它会在logs文件里生成localhost_access_log的访问日志 --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.hzg.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/myweb1" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="hzg_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>patter解释
有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:
- %a - 远程IP地址
- %A - 本地IP地址
- %b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
- %B - 发送的字节数,不包括HTTP头
- %h - 远程主机名
- %H - 请求协议
- %l (小写的L)- 远程逻辑从identd的用户名(总是返回’ - ‘)
- %m - 请求方法
- %p - 本地端口
- %q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
- %r - 第一行的要求
- %s - 响应的HTTP状态代码
- %S - 用户会话ID
- %t - 日期和时间,在通用日志格式
- %u - 远程用户身份验证
- %U - 请求的URL路径
- %v - 本地服务器名
- %D - 处理请求的时间(以毫秒为单位)
web.xml
Tomcat中所有应用默认的部署描述文件,主要定义了基础的Servlet和MIME映射(mime-mapping 文件类型,其实就是Tomcat处理的文件类型),如果部署的应用中不包含Web.xml,那么Tomcat将使用此文件初始化部署描述,反之,Tomcat会在启动时将默认描述与定义描述配置进行合并。
加载一些tomcat内置的servlet
DefaultServlet默认的,加载静态文件 html,js,jpg等静态文件。
JspServlet专门处理jsp。
context.xml
用于自定义所有Web应用均需要加载的Context配置,如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖。
context.xml与server.xml中配置context的区别
server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
catalina.policy
权限相关 Permission ,Tomcat是跑在jvm上的,所以有些默认的权限
tomcat-users.xml
配置Tomcat的server的manager信息
COPY<?xml version="1.0" encoding="UTF-8"?> <tomcat-users xmlns="tomcat.apache.org/xml" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="manager-gui"/> <user username="manager" password="manager" roles="manager-gui"/> </tomcat-users>logging.properties
设置tomcat日志
控制输出不输出内容到文件,不能阻止生成文件,阻止声文件可用注释掉
lib目录
lib目录主要用来存放tomcat运行需要加载的jar包。
例如,像连接数据库的jdbc的包我们可以加入到lib目录中来。
Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;
logs目录
logs目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志。(清空不会对tomcat运行带来影响)
这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中
在windows环境中,控制台的输出日志在catalina.xxxx-xx-xx.log文件中 在linux环境中,控制台的输出日志在catalina.out文件中
- localhost-xxx.log:Web应用的内部程序日志,建议保留
- catalina-xxx.log:控制台日志
- host-manager.xxx.log:Tomcat管理页面中的host-manager的操作日志,建议关闭
- localhost_access_log_xxx.log:用户请求Tomcat的访问日志(这个文件在conf/server.xml里配置),建议关闭
temp目录
temp目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响)
webapps目录
webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。
当然,你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行。
存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。localhost:8080/examples,进入示例项目。其中examples就是项目名,即文件夹的名字。
work目录
work目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。 清空work目录,然后重启tomcat,可以达到清除缓存的作用。
运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。
Tomcat组件及架构
Server
Server是最顶级的组件,它代表Tomcat的运行实例,它掌管着整个Tomcat的生死大权;
- 提供了监听器机制,用于在Tomcat整个生命周期中对不同时间进行处理
- 提供Tomcat容器全局的命名资源实现,JNDI
- 监听某个端口以接受SHUTDOWN命令,用于关闭Tomcat
Service
一个概念,一个Service维护多个Connector和一个Container
它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。
Connector组件
链接器:监听转换Socket请求,将请求交给Container处理,支持不同协议以及不同的I/O方式
TOMCAT有两个典型的Connector,一个直接侦听来自browser的localhost:8080/test/index.jsp
本文由传智教育博学谷狂野架构师教研团队发布。
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。
转载请注明出处!
本文共计2486个文字,预计阅读时间需要10分钟。
Tomcat架构及项目结构解析,bin目录主要存放Tomcat的启动命令。主要分为两大类:一类是以.sh结尾的Linux命令,另一类是以.bat结尾的Windows命令。包含多个环境变量设置。
Tomcat体系架构
Tomcat项目结构
bin目录
bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。
很多环境变量的设置都在此处,例如可以设置JDK路径、tomcat路径
- startup文件:主要是检查catalina.bat/sh 执行所需环境,并调用catalina.bat 批处理文件。启动tomcat。
- catalina文件:真正启动Tomcat文件,可以在里面设置jvm参数。后面性能调优会重点讲
- shutdown文件:关闭Tomcat
- 脚本version.sh、startup.sh、shutdown.sh、configtest.sh都是对catalina.sh的包装,内容大同小异,差异在于功能介绍和调用catalina.sh时的参数不同。
- Version:查看当前tomcat的版本号,
- Configtest:校验tomcat配置文件server.xml的格式、内容等是否合法、正确。
- Service:安装tomcat服务,可用net start tomcat 启动
conf目录
conf目录主要是用来存放tomcat的一些配置文件。
- server.xml:可以设置端口号、设置域名或IP、默认加载的项目、请求编码
- web.xml:可以设置tomcat支持的文件类型
- context.xml:可以用来配置数据源之类的
- tomcat-users.xml:用来配置管理tomcat的用户与权限
- 在Catalina目录下可以设置默认加载的项目
server.xml
COPY<?xml version="1.0" encoding="UTF-8"?> <!-- Server代表一个 Tomcat 实例。可以包含一个或多个 Services,其中每个Service都有自己的Engines和Connectors。 port="8005"指定一个端口,这个端口负责监听关闭tomcat的请求 --> <Server port="8005" shutdown="SHUTDOWN"> <!-- 监听器 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- 全局命名资源,定义了UserDatabase的一个JNDI(java命名和目录接口),通过pathname的文件得到一个用户授权的内存数据库 --> <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它包含一个<Engine>元素,以及一个或多个<Connector>,这些Connector元素共享用同一个Engine元素 --> <Service name="Catalina"> <!-- 每个Service可以有一个或多个连接器<Connector>元素, 第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定 义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求. --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- 每个Service只能有一个<Engine>元素 --> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- 默认host配置,有几个域名就配置几个Host,但是这种只能是同一个端口号 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Tomcat的访问日志,默认可以关闭掉它,它会在logs文件里生成localhost_access_log的访问日志 --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.hzg.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/myweb1" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="hzg_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>patter解释
有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:
- %a - 远程IP地址
- %A - 本地IP地址
- %b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
- %B - 发送的字节数,不包括HTTP头
- %h - 远程主机名
- %H - 请求协议
- %l (小写的L)- 远程逻辑从identd的用户名(总是返回’ - ‘)
- %m - 请求方法
- %p - 本地端口
- %q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
- %r - 第一行的要求
- %s - 响应的HTTP状态代码
- %S - 用户会话ID
- %t - 日期和时间,在通用日志格式
- %u - 远程用户身份验证
- %U - 请求的URL路径
- %v - 本地服务器名
- %D - 处理请求的时间(以毫秒为单位)
web.xml
Tomcat中所有应用默认的部署描述文件,主要定义了基础的Servlet和MIME映射(mime-mapping 文件类型,其实就是Tomcat处理的文件类型),如果部署的应用中不包含Web.xml,那么Tomcat将使用此文件初始化部署描述,反之,Tomcat会在启动时将默认描述与定义描述配置进行合并。
加载一些tomcat内置的servlet
DefaultServlet默认的,加载静态文件 html,js,jpg等静态文件。
JspServlet专门处理jsp。
context.xml
用于自定义所有Web应用均需要加载的Context配置,如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖。
context.xml与server.xml中配置context的区别
server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
catalina.policy
权限相关 Permission ,Tomcat是跑在jvm上的,所以有些默认的权限
tomcat-users.xml
配置Tomcat的server的manager信息
COPY<?xml version="1.0" encoding="UTF-8"?> <tomcat-users xmlns="tomcat.apache.org/xml" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="manager-gui"/> <user username="manager" password="manager" roles="manager-gui"/> </tomcat-users>logging.properties
设置tomcat日志
控制输出不输出内容到文件,不能阻止生成文件,阻止声文件可用注释掉
lib目录
lib目录主要用来存放tomcat运行需要加载的jar包。
例如,像连接数据库的jdbc的包我们可以加入到lib目录中来。
Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;
logs目录
logs目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志。(清空不会对tomcat运行带来影响)
这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中
在windows环境中,控制台的输出日志在catalina.xxxx-xx-xx.log文件中 在linux环境中,控制台的输出日志在catalina.out文件中
- localhost-xxx.log:Web应用的内部程序日志,建议保留
- catalina-xxx.log:控制台日志
- host-manager.xxx.log:Tomcat管理页面中的host-manager的操作日志,建议关闭
- localhost_access_log_xxx.log:用户请求Tomcat的访问日志(这个文件在conf/server.xml里配置),建议关闭
temp目录
temp目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响)
webapps目录
webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。
当然,你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行。
存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。localhost:8080/examples,进入示例项目。其中examples就是项目名,即文件夹的名字。
work目录
work目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。 清空work目录,然后重启tomcat,可以达到清除缓存的作用。
运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。
Tomcat组件及架构
Server
Server是最顶级的组件,它代表Tomcat的运行实例,它掌管着整个Tomcat的生死大权;
- 提供了监听器机制,用于在Tomcat整个生命周期中对不同时间进行处理
- 提供Tomcat容器全局的命名资源实现,JNDI
- 监听某个端口以接受SHUTDOWN命令,用于关闭Tomcat
Service
一个概念,一个Service维护多个Connector和一个Container
它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。
Connector组件
链接器:监听转换Socket请求,将请求交给Container处理,支持不同协议以及不同的I/O方式
TOMCAT有两个典型的Connector,一个直接侦听来自browser的localhost:8080/test/index.jsp
本文由传智教育博学谷狂野架构师教研团队发布。
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。
转载请注明出处!

