Tomcat学习总结
本篇主要介绍tomcat服务器的详细配置,请求处理流程,以及简单的优化方法:
- tomcat详细配置
- 请求处理流程
- 简单的优化方法
tomcat详细配置
server.xml的基本结构
<?xml version="1.0" encoding="UTF-8"?>
<Server>
<Listener />
<GlobaNamingResources />
<Service>
<Connector />
<Engine>
<Logger />
<Realm />
<host>
<Logger />
<Context />
</host>
</Engine>
</Service>
</Server>
元素 | 属性 | 说明 |
---|---|---|
server | port | 指定负责监听tomcat关闭请求的端口 |
shutdown | 指定向端口发送的命令字符串 | |
service | name | 指定service的名字 |
Connector(客户端与service之间的连接) | port | 用于监听客户端的端口号 |
minProcessors | 服务器启动时创建的用于处理请求的线程数 | |
maxProcessors | 最大可以创建的处理请求的线程数 | |
redirectPort | 指定服务器正在处理http请求时收到一个SSL传输请求后重定向的端口号 | |
acceptCount | 当所有处理请求的线程都被使用时,可以放到处理队列中的请求数,超过这个数的请求不予处理 | |
connectionTimeout | 指定连接超时 | |
Engine(service中的请求处理机,接收和处理来自Connector的请求) | defaultHost | 缺省的处理请求的虚拟主机名,必须与其中一个host元素的name属性值一样。 |
Context(表示一个web应用,通常为WAR文件) | docBase | 应用程序的路径或者WAR文件存放路径 |
path | 此应用程序的url前缀 | |
reloadable | 是否自动检测WEB-INF/lib和WEB-INF/classes目录的变化,自动装载新的应用程序 | |
host(表示一个虚拟主机) | name | 虚拟主机名 |
appBase | 应用程序的基本目录,一般为webapps | |
unpackWARS | 如果为true,则tomcat自动解压WAR文件,否则不解压,直接从WAR文件中运行 | |
Logger(日志、调试和错误) | className | 指定logger使用类名,该类必须实现org.apache.catalina.Logger接口 |
prefix | 指定log文件的前缀 | |
suffix | 指定log文件的后缀 | |
timestamp | 文件名是否加入时间,如:localhost_log.001-10-04.txt | |
Realm(存放用户名,密码及role的数据库) | className | 指定类名,必须实现org.apache.catalina.Realm接口 |
Value(功能和Logger差不多) | className | 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 |
directory | log文件的存放目录 | |
pattern | 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多 |
配置示例
<Connector
port="8080"
minSpareThreads="5"
maxSpareThread="75"
enableLookups="false"
redirectPort="8443"
acceptCount="100"
debug="0"
connectionTimeout="20000"
disableUploadTimeout="true" />
建立一个连接器用于监听8080端口,初始创建minSpareThreads(5)个线程等待客户请求,每个请求由一个线程负责。设定服务器可以同时响应的客户请求的最大数目为maxSpareThread(75),当现有线程已经达到最大值maxSpareThread(75)时,用户请求被排队等待处理,当队列中请求数量超过acceptCount(100)时,请求将不予处理。当用户请求的是https时,该请求被转发到端口8443。将enableLookups设置为false可以禁用DNS查询,web应用中调用request.getRemoteHost方法将返回客户IP。connectionTimeout定义建立连接超时。
请求处理流程
举例说明Tomcat处理客户请求的流程:
假设来自客户的请求为 http://localhost:8080/test/index.jsp
- 侦听8080端口的Http/1.1 Connector获得该请求。
- Connector将请求交给Engine,并等待Engine回应。
- Engine将请求与其所拥有的所有虚拟主机匹配
- Engine匹配到localhost对应的虚拟主机host(匹配不到交给默认host)
- host获取请求/test/index.jsp匹配其所有的Context
- host匹配到/test的Context(匹配不到交给path为”“的Context处理)
- Context匹配到对应的Servlet,构造HttpServletRequest和HttpServletResponse对象,作为JspServlet的doGet和doPost方法的参数传入。
- Context将执行后的HttpServletResponse对象返回host
- host将HttpServletResponse对象返回Engine
- Engine将HttpServletResponse对象返回Connector
- Connector将HttpServletResponse对象返回客户端
简单的优化方法
1. 扩大JVM内存
在catalina.bat中适当位置加入 set JAVA_OPTS=-Xms256M -Xmx512M
-Xms 初始化JVM内存, -Xmx最大内存(设置过小会导致内存溢出)
2. 增加处理线程
在server.xml中配置Connector属性,增加minSpareThreads,maxSpareThreads,acceptCount,maxThreads,maxProcessors,minProcessors等来合理配置服务器用于处理请求的线程数量。
3. 关闭DNS查询
在server.xml中配置Connector属性,增加enableLookups=”false”,可禁用DNS查询。
4. 启用gzip压缩
在server.xml中配置Connector属性,增加
compression=”on”
compressionMinSize=”2048”
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”