前言
今天小编新开一个tomcat的分享章节,主要是最近需要布置一下环境,然后项目基本都是tomcat作为web容器,还记得小编刚刚开始接触tomcat的时候版本还是7现在都到10了,官网都不推荐7了,其线程模型也从bio到nio了。
当然tomcat小编不会深入讲解,大致会讲解tomcate的架构体系,生产环境如何搭建使用,http请求处理流程(一个请求如何到达咱们的项目中的servlet),还有就是io的网络通信模型。
好了介绍完大致要分享的内容,咱们进入正题。
Tomcat架构体系
架构说明
Tomcat是⼀个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx apache 服务器不同在于⼀般⽤于动态请求处理(这边说明其支持html,以及动态请求和页面渲染,早期服务器一般是不支持动态请求的,只支持html,这在早期是比较牛的)。在架构设计上采⽤⾯向组件的⽅式设计。即整体功能是通过组件的⽅式拼装完成。另外每个组件都可以被替换以保证灵活性。
上面说了tomcat是面向组件设计的,也就是可以像积木一样拼接,那小编带大家看下tomcat的架构图。
架构图
看来上面的架构图,是不是不太明白,那下面小编讲一下各个组件的作用
各个组件以及关系
- Server:顶级模块,一个tomcat进程只有一个Server,有个端口用于关闭。理解为服务器
- Service:一个Server可以有多个Service,可以理解为服务,有多个,但是请求无法直接到达服务,就需要下面的Connector组件了。
- Connector:通过连接器我们就可以请求到我们的服务,连接器的话有不同的协议,如http,jk2等,连接器有两个属性一个是协议,一个是端口号。
- Engine:引擎组件,当连接进来后到达服务,那有引擎来处理请求
- Host:引擎里面包含多个站点。他主要是基于域名来分发请求。
- Context:站点又可包含多个Context,context对应到多个servlet。这里Context可以理解为应用,这里主要为隔离各个WEB应用,然后每个Context的ClassLoader都是独立。
到这儿各个组件的作用和关系就差不多了,希望大家能够理解。当然还可以划分为顶层组件(Server和Service),连接器组件(Connector),容器组件(Engine,Host,Context),其他组件(日志等,这里不表)。小编画了一张简易图希望加深大家印象:
接下来根据上面组件的理解,继续看下server.xml的配置:
详解sever.xml配置
小编贴上配置:
<?xml version="1.0" encoding="UTF-8"?>
<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" />
<GlobalNamingResources>
<!-- 用户名密码,配置中tomcat-user.xml-->
<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 name="Catalina">
<!-- 可以有多个连接,一般情况下不会配置多个连接器,现在都用ngnix了-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 协议处理器,7.0版本默认bio,8.0默认nio,9.0没有bio了 -->
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 引擎,默认host 为localhost ,如果域名你写为127.0.0.1则匹配到默认的,因为Host 中的name都匹配不到-->
<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">
<!-- 阀门 这里陪着了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>
<!-- 站点的根路径以及name,默认是webapps下面的,unpackWARS为默认是否解压war包,autoDeploy为自动发布 -->
<!-- 这里要访问www.lecture.com则需要配置host文件 -->
<Host name="www.lecture.com" appBase="/Users/lectrue/data/www"
unpackWARs="true" autoDeploy="true">
<!-- 直接配置他的项目docBase,这样就可以访问其所有的内容,path不需要斜杆 -->
<!-- 这个配置可以做engine的host下面配置xxx.xml,xxx可以作为名字路径 ,大家记住这个后续很有用-->
<Context path="tomcat" docBase="/Users/lectrue/temp/tomcat-10.0.8">
</Context>
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8083" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina2" 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">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
上面文字比较多,那希望看到博客的小伙伴可以耐心看完。接下来我们聚焦一下connector的配置;
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="5"
minSpareThreads="2"
maxConnectors = "10"
acceptCount = "5"
/>
小编重点解释一下这些配置,一般情况下我们不需要去修改他:
- port: 指定服务器端要创建的端口号
- protocol: 监听的协议,默认是http/1.1
- connectionTimeout:这里的超时时间是网络读写的时间
- maxThreads:最大线程数量
- minSpareThreads:启动的时候请求业务的线程
- maxConnectors :当请求大于线程数量的时候,会放入队列,连接依然可以进来,但是连接最大连接数为10
- acceptCount :当到达最大连接数的时候可以接受等待的数量
当然还可以把线程池配置单独拿出来,connector里面进行引用
<Executor name="myExecutor" maxThreads="5" minSpareThreads="2" />
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
executor ="myExecutor"
maxConnectors = "10"
acceptCount = "5"
/>
当然要理解全部最好去看官网或者看配置的注释。
总结
今天主要是分享了tomcat的整体的结构体系已经核心配置。还是比较简单的,大家可以在自己的环境上操作配置,来一一证明上述的理论。或许小编讲错了呢!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13546.html