Tomcat学习总结

摘要:一、Tomcat的组成和架构 1、Tomcat目录结构 bin,可执行文件 conf,配置文件 lib,Tomcat的依赖库,web应用依赖的包也可放这里 logs,Tomcat默认存放日志位置 temp,临时文件夹 webapps,默认应用部署目录 work,供web应用使用,例如jsp编译成的servlet就放这里   2、JVM启动参数 环境变量JAVA_OPT

一、Tomcat的组成和架构 1、Tomcat目录结构

bin,可执行文件

conf,配置文件

lib,Tomcat的依赖库,web应用依赖的包也可放这里

logs,Tomcat默认存放日志位置

temp,临时文件夹

webapps,默认应用部署目录

work,供web应用使用,例如jsp编译成的servlet就放这里

1 (76).jpg

 

2、JVM启动参数

环境变量JAVA_OPTS

-server –Xms512m –Xmx512m

Xms初始堆,

Xmx最大堆内存,受限于物理内存

一般让两者一样

 

3、Tomcat架构与配置文件

server.xml配置结构如下:

<Server> <Service> <Connector> </Connector> <Engine> <Host> <Context> </Context> </Host> </Engine> </Service> </Server>

tomcat结构图如下(侵权删):

从里面到Service这一层可以称作Container

Server服务器下可以有多个Service

Service:可以配置多个

Connector:接收用户请求的,可以配置多个

Connector的实现:Coyote,默认BIO Connector阻塞式IO,java传统IO

Engine:是处理Connector接收到的请求,java代码由他处理

Host:虚拟主机

Context:一个Context就是一个应用

Web应用:Context和Web应用可以画等号

Container:由Catalina实现。

Catalina也是Tomcat中实现容器的组件,用来执行Web应用

 

4、请求处理流程

客户端发出请求,Connector负责解析请求,然后交给Container处理,Container处理请求,例如获取资源,然后让Connector返回相关内容。

 

二、Tomcat的Connector和线程池配置 1、Connector参数配置

port:端口号

address:服务器上的IP不止一个,如果不配置,默认监听所有地址,可以通address指定监听哪些地址

protocol:协议,默认http1.1

connectionTimeout:连接超时时间,默认单位毫秒

acceptCount:如果系统没有空闲线程能处理请求,请求就要排队,排队默认值100,超过的就不处理了。

maxConnections:支持最大连接数,与线程池有关,-1表示不限制

2、 线程池和线程池配置

事先创建一定数目的线程,当有任务的时候,从池中取出使用,用完就放回池中。

Tomcat中使用的是弹性线程池。

minSpareThreds:最小空闲线程数

maxThreads:最大线程数

配置方式:

1、线程池配置项<Executor>

minSpareThreads

maxThreads

2、Connector配置线程池

1)指定依赖的线程池配置,即指定依赖<Executor>

2)直接指定线程池配置参数,在Connector中配置minSpareThreads,maxThreads

3、curl和telnet连接

可以用这两种方式发出请求

 

三、Tomcat的日志和配置和war包部署 1、tomcat的日志分类

系统运行日志

访问日志:在server.xml中配置

应用日志

2、部署方式

先将项目有打成war包

放置在webapps目录下

启动tomcat

可以看见war包已经被解压在webapps目录下

 

四、基本配置示例

<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" /> </GlobalNamingResources> <Service name="Catalina"> <!-- Executor线程池配置项,maxThreads最大线程数,minSpareThreds最小空闲线程数 --> <Executor name="myThreadPool" namePrefix="catalina-exec-" maxThreads="120" minSpareThreads="4" /> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> <!-- connectionTimeout单位毫秒,port访问端口号,executor="myThreadPool"设置Connector使用名字叫myThreadPool的线程池配置 当然也可以直接在Connector中直接配置线程池选项maxThreads和minSpareThreads,但是最好配置成线程池配置项,方便多个Connector依赖 --> <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" executor="myThreadPool" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine defaultHost="localhost" name="Catalina"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> </Realm> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <!-- directory日志输出路径,可以配置相对路径(相对于tomcat安装的根路径),也可以配置绝对路径 prefix日志文件前缀 suffer日志文件名字 pattern日志格式,下面是tomcat默认日志格式 pattern具体看tomcat文档,这里给出一部分 %m是请求方法 %a是ip %t是时间 %s是状态码 %b是服务端下发字节数 %{User-Agent}i是发起请求的客户端 fileDateFormat="yyyy-MM-dd."时戳 rotatable="true"按照fileDateFormat时戳的改变进行日志滚动(日志切分) --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt" /> <Context docBase="mall" path="/mall" reloadable="true" source="org.eclipse.jst.jee.server:mall" /> </Host> </Engine> </Service> </Server>