tomcat
概念
原理: tomat
一个servlet
(Java Servlet
的简称,小服务程序或服务连接器)容器,来处理http
请求。在平时的使用中我们都会再浏览器中输入http
地址来访问服务资源,比如格式http://host[":"port][abs_path]
。从浏览器到服务端的一次请求都遵循http
协议,在网络上其实走仍然是tcp
协议,即我们常使用的socket
来处理客户端和服务器的交互。根据输入的http
地址可以知道服务器的IP
地址和端口,根据这两个参数就可以定位到服务器的唯一地址。tomcat
根据http
地址端口后面的资源路径就可以知道反馈什么样的资源给浏览器。
配置文件详解
-
目录结构
/bin
:脚本文件目录。
/common/lib
:存放所有web项目都可以访问的公共jar
包(使用Common
类加载器加载)。
/conf
:存放配置文件,最重要的是server.xml
。
/logs
:存放日志文件。
/server/webapps
:来管理Tomcat-web
服务用的。仅对TOMCAT
可见,对所有的WEB APP
都不可见(使用Catalina
类加载器加载)。
/shared/lib
:仅对所有WEB APP
可见,对TOMCAT
不可见(使用Shared
类加载器加载)。
/temp
:Tomcat
运行时候存放临时文件用的。
webapps
:web
应用发布目录。
/work
:Tomcat
把各种由jsp
生成的servlet
文件放在这个目录下。删除后,启动时会自动创建。 -
配置文件
server.xml
:主要的配置文件。
web.xml
:缺省的web app
配置,WEB-INF/web.xml
会覆盖该配置。server.xml
配置
server
标签
port
:指定一个端口,这个端口负责监听关闭tomcat的请求。
shutdown
:指定向端口发送的命令字符串.service
标签
name
:指定service
的名字。Connector
(表示客户端和service
之间的连接)标签
port
:指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
minProcessors
:服务器启动时创建的处理请求的线程数。
maxProcessors
:最大可以创建的处理请求的线程数。
enableLookups
:如果为true
,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false
则不进行DNS查询,而是返回其ip地址。
redirectPort
:指定服务器正在处理http
请求时收到了一个SSL
传输请求后重定向的端口号。
acceptCount
:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connectionTimeout
:指定超时的时间数(以毫秒为单位)。
Engine
(表示指定service
中的请求处理机,接收和处理来自Connector
的请求)标签
defaultHost
:指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的。
Context
(表示一个web
应用程序,通常为WAR
文件,关于WAR
的具体信息见servlet
规范)标签
docBase
:该web
应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使用绝对路径,也可以使用相对于context所属的Host的appBase路径。
path
:表示此web
应用程序的url
的前缀,这样请求的url
为http://localhost:8080/path/****。
reloadable
:这个属性非常重要,如果为true
,则tomcat
会自动检测应用程序的/WEB-INF/lib
和/WEB-INF/classes
目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序。host
(表示一个虚拟主机)标签
name
:指定主机名。
appBase
:应用程序基本目录,即存放应用程序的目录。
unpackWARs
:如果为true
,则tomcat
会自动将WAR
文件解压,否则不解压,直接从WAR文件中运行应用程序。Logger
(表示日志,调试和错误信息)标签
className
:指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口。
prefix
:指定log文件的前缀。
suffix
:指定log文件的后缀。
timestamp
:如果为true
,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt。
tomcat的优化
- 内存的优化
优化内存,主要是在bin/catalina.bat或bin/catalina.sh 配置文件中进行。linux上,在catalina.sh中添加:
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"
\\其中:
• -server:启用jdk的server版本。
• -Xms:虚拟机初始化时的最小堆内存。
• -Xmx:虚拟机可使用的最大堆内存。 #-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
• -XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。
• -XX:MaxNewSize:新生代占整个堆内存的最大值。
• -XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
- 连接数优化
-
- 优化线程数
找到Connectorport=“8080” protocol=“HTTP/1.1”,增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下:
- 优化线程数
<Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
其中:
• maxThreads:tomcat可用于请求处理的最大线程数,默认是200
• minSpareThreads:tomcat初始线程数,即最小空闲线程数
• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100
-
- 使用线程池
在server.xml中增加executor节点,然后配置connector的executor属性,如下:
- 使用线程池
<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中:
• namePrefix:线程池中线程的命名前缀
• maxThreads:线程池的最大线程数
• minSpareThreads:线程池的最小空闲线程数
• maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
• threadPriority:线程优先级
\\注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查:
• ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
• lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
• 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
- Tomcat Connector三种运行模式(BIO, NIO, APR)
三种模式比较:
1)BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
2)NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
3)APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
*
参考tomcat优化