Tomcat目录结构
- bin,存放tomcat的可执行脚本,startup等。还存放着这些脚本执行所依赖的jar包。
- conf,存放配置文件,server.xml等。
- lib,存放tomcat的依赖库,tomcat和web项目共同依赖的jar包也可以放到这个目录下。
- logs,默认情况,存放日志的位置。
- temp,存放临时文件。
- webapps,默认的应用部署目录。
- work,存放tomcat运行过程中产生的文件,如在tomcat中跑jsp时,翻译出来的servlet就会放在这个目录下。
- LICENSE,许可证文件
- NOTICE
- RELEASE-NOTES
- RUNNING.txt
JVM启动参数配置
- Tomcat是Java写的,Tomcat本身也是一个Java程序,在运行的时候需要依赖JVM,是可以配置JVM启动参数的。
- 可以使用环境变量来配置JVM启动参数的。
- 环境变量就是一些变量,可以来控制系统或者应用程序的一些行为的。
- 这个环境变量是JAVA_OPTS。
JAVA_OPTS常见的参数:
-server -Xms512m -Xmx512m
-service
告诉JVM这是一个服务器应用,JVM可以做一些自己认为的优化。-Xms512m -Xmx512m
是用来调试JVM中堆大小的。
Xms
是用来调整初始堆内存的。-Xmx
是用来调整最大堆内存的。- 最大堆内存是受限于物理内存的。
- 当业务量大时才会调整后两个参数。
- 调大初试堆和最大堆
JAVA_OPTS="-server -Xms2048m -Xmx2048m"
Tomcat配置文件
配置文件为conf目录下的server.xml,文件的详细结构:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
<Connector port="8092" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
去除各种属性后的结构:
<Server>
<Service>
<Connector>
</Connector>
<Engine>
<Host>
<Context></Context>
</Host>
</Engine>
</Service>
</Server>
- Server是根元素,Server下面可以有多个service配置的
- 在Service下可以配置多个Connector
- 而Connector是用来接收用户请求的
- 一个Service下必须只有一个Engine,用来处理Connector接收到的请求的,Java代码都是由Engine来执行的。
- 在一个Engine下可以有多个Host的,Host是虚拟主机的概念,一般来说一个IP加一个端口构成了一个队。
- 一个IP端口对可以为多个域名提供服务的,我们可以在多个请求下加入不同的Host头,来决定路由到哪一个Host进行处理。
在Host里面可以有一个或多个Context的,一个Context实际就是一个Web应用。
Web应用是被Service等包着的,Service这些就是容器——Container。
- Tomcat是Web应用的容器,整个Server就是Tomcat。
Tomcat对应的这些组件的实现
- Connector
- 由Coyote实现,Coyote这个组件实现了多种不同的Connector。
- Tomcat默认的,最常见的就是BIO Connector。
- BIO Connector使用比较传统的阻塞式的IO操作的方式,对应实现方式也是传统的Java IO的实现。
- 具体就是当客户端有一个连接过来的时候,服务端这边就会分配一个线程去处理,如果这个请求比较大,发了很久一个请求头还没有发完,那对应的处理线程就只能一直等待。因此叫阻塞式IO。
- Container,执行代码逻辑
- 对于Tomcat来说,Container的具体实现是Catalina,这也就说明了配置环境变量时为什么配的是Catalina。因为Catalina是实现容器的组件,我们最终的代码都是由Catalina中的代码来执行的。
Tomcat请求处理流程
- 浏览器发出请求。
- Connector接收请求并处理,connector会完成一些socket方面操作,会从socket上读取数据,会对请求进行解析,解析完成之后交给Container进行处理。
- Container中,对于Tomcat中来说就是Catalina,Catalina中会根据Connector中解析出来的内容来确定具体请求来响应什么东西,如静态页面、图片、动态内容等。
- Container会根据请求的内容生成具体的响应,这个响应在由Connector下发到浏览器。
- 因此Connector是用来完成网络处理相关的部分;而Container是用来执行web应用的代码,包括去查找一些静态资源。