学习Tomcat(二)
一、 Java简介
JDK: 面向开发人员使用的SDK,提供Java的开发环境和运行环境
SDK: 软件开发包,包括函数库、编译程序等
JRE: Java的运行环境,面向Java的使用者,不是开发者
二、 Tomcat安装
1、软件准备 JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Tomcat下载:http://tomcat.apache.org/ 2、部署java环境 # mkdir /application/tools/ -p # cd /application/tools/ # tar xf jdk-8u60-linux-x64.tar.gz -C /application/ # ln -s /application/jdk1.8.0_60 /application/jdk # sed -i.ori '$a export JAVA_HOME=/application/jdk\n export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\n export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile # source /etc/profile # java -version 3、安装Tomcat # tar xf apache-tomcat-8.0.27.tar.gz -C /application/ # ln -s /application/apache-tomcat-8.0.27 /application/tomcat # echo 'export TOMCAT_HOME=/application/tomcat' >> /etc/profile # source /etc/profile # useradd -u 601 tomcat # chown -R tomcat.tomcat /application/jdk/ /application/tomcat/ # tail -4 /etc/profile export JAVA_HOME=/application/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar export TOMCAT_HOME=/application/tomcat 4、Tomcat目录介绍 # tree -L 1 /application/tomcat/ ├── bin #管理Tomcat脚本文件(.bat和.sh) ├── conf #配置文件(XML和DTD) ├── lib #web应用访问的JAR包 ├── LICENSE ├── logs #Catalina和应用的日志文件 ├── NOTICE ├── RELEASE-NOTES ├── RUNNING.txt ├── temp #临时文件 ├── webapps #Web应用程序根目录 └── work #JSP编译出的Servlet的.java和.class文件 # ll webapps/ drwxr-xr-x 14 root root 4096 docs #tomcat帮助文档 drwxr-xr-x 6 root root 4096 examples #web应用实例 drwxr-xr-x 5 root root 4096 host-manager #管理 drwxr-xr-x 5 root root 4096 manager #管理 drwxr-xr-x 3 root root 4096 ROOT #默认网站根目录 5、启动Tomcat # /application/tomcat/bin/startup.sh #启动程序 # /application/tomcat/bin/shutdown.sh #关闭程序 # netstat -tunlp | grep java # ps -ef | grep java 6、访问网站 网址: http://192.168.1.11:8080/ 7、Tomcat日志 # tailf /application/tomcat/logs/catalina.out 8、tomcat 启动和停止的方法 1) 启动Tomcat 方法1 # /opt/tomcat/bin/startup.sh 方法2 # /opt/tomcat/bin/catalina start 2) 停止Tomcat 方法1 # /opt/tomcat/bin/shutdown.sh 方法2 # /opt/tomcat/bin/catalina stop 3) 重启Tomcat 方法1 # /opt/tomcat/bin/shutdown.sh # /opt/tomcat/bin/startup.sh 方法2 # /opt/tomcat/bin/catalina restart 方法3 # /opt/tomcat/bin/catalina stop # /opt/tomcat/bin/catalina start
三、Tomcat配置文件
1、配置文件介绍
server.xml #主配置文件
tomcat-users.xml #管理用户配置文件
2、Tomcat管理(生产环境不要用)
# vim /application/tomcat/conf/tomcat-users.xml <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="123456" roles="manager-gui,admin-gui"/> # /application/tomcat/bin/shutdown.sh # /application/tomcat/bin/startup.sh
3、主配置文件详解
1、配置文件结构 <server> #顶级组件,位于整个配置的顶层 <service> #容器类组件,可包含其它组件 <connector /> #连接器组件,用户请求连接tomcat <engine> #容器类组件,可包含其它组件 <host> #容器类组件,可包含其它组件 <context></context> #容器类组件,可包含其它组件 </host> <host> <context></context> <Valve /> #被嵌套类组件,位于一个容器中,不能包含其他组件 </host> </engine> </service> </server> 2、配置文件注释 <?xml version='1.0' encoding='utf-8'?> <!-- <Server> #实例的顶层元素,代表整个容器 port: #关闭tomcat端口 shutdown: #关闭tomcat字符串 --> <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> <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服务组件 --> <Service name="Catalina"> <!-- connector #接收用户请求 port: #服务监听端口号 address: #服务监听地址,默认0.0.0.0 protocol: #连接器使用的协议,支持HTTP和AJP(ajp:httpd反向代理tomcat时用) minProcessors #最小处理请求的线程数 maxProcessors #最大处理请求的线程数 enableLookups #是否开启DNS查询,true:返回主机名,false:返回ip redirectPort #https端口号 acceptCount #队列的请求数 connectionTimeout #连接超时时间,单位:毫秒 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- engine #核心容器组件,catalina引擎,接收并处理用户请求 defaultHost #默认处理请求的主机名 --> <Engine name="Catalina" defaultHost="localhost"> <!-- Realm #存放用户名,密码及role的数据库 --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- host #一个虚拟主机 name: #主机名 appBase: #应用程序的目录,app的目录,可相对路径,也可绝对路径 unpackWARs: #是否自动解压war包,true:不解压,false:解压 autoDeploy: #是否自动部署war包 xmlValidation: #是否启动xml的校验功能,一般不效验 xmlNamespaceAware: #是否检测名称空间,一般不检测 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Context #一个web应用程序,通常为WAR文件 docBase #webapp的war包目录,相对路径或绝对路径 path #webapp的url的前缀,url:http://localhost:8080/path/webapp reloadable #自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes --> <Context path="" docBase="" debug=""/> <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>
4、组件详解
server | port | 关闭tomcat端口 |
shutdown | 关闭tomcat字符串 | |
service | name | 服务的名称,默认:Catalina |
Connector | port | 服务监听端口号 |
address | 服务监听地址,默认0.0.0.0 | |
protocol | 连接器协议类型,支持HTTP(BIO,NIO,NIO2,APR)和AJP(httpd反向代理tomcat时用) | |
minProcessors | 最小处理请求的线程数 | |
maxProcessors | 最大处理请求的线程数 | |
enableLookups | 是否开启DNS查询,true:返回主机名,false:返回ip | |
redirectPort | https端口号 | |
acceptCount | 队列的请求数 | |
connectionTimeout | 连接超时时间,单位:毫秒 | |
maxThreads | 最大并发连接数 | |
allowTrace | 是否跟踪请求转发过程,一般不跟踪 | |
asyncTimeout | 一部分访问超时时间,默认是30000(30秒) | |
maxHeaderCount |
最大的headers信息数量,默认100,0为不限制 |
|
maxParameterCount | 最大的参数数量,默认1000,0为不限制 | |
maxPostSize | 最大POST请求提交数据包,默认为2M | |
maxSavePostSize | SSL验证最大缓存大小,默认是4k | |
scheme | 协议名字,默认http | |
secure | 是否用安全模式通信,默认false | |
useIPVHosts | 是否用IP指向虚拟主机,默认false | |
xpoweredBy | 是否添加X-Powered-By头信息 | |
executor | 指定使用线程池,默认使用内置的线程池 | |
acceptorThreadCount | cpu数量 | |
compressableMimeType | 压缩类型 | |
compression | 是否开启压缩 | |
compressionMinSize | 压缩文件最小值 | |
connectionUploadTimeout | 上传文件的超时时间 | |
disableUploadTimeout | 是否禁用上传超时时间 | |
keepAliveTimeout | Keep-Alive连接超时时间,默认和connectionTimeout一致 | |
maxConnections | 最大连接数,NIO:10000,APR:8192(windows:1024) | |
maxKeepAliveRequests | 最大保持活跃的连接数,默认100 | |
minSpareThreads | 最小空闲线程数 | |
maxSpareThreads | 最大空闲线程数 | |
maxHttpHeaderSize | 请求和响应的HTTP头的最大大小,单位:字节 | |
tcpNoDelay | 可以提高性能,默认是true | |
noCompressionUserAgents | 对于以下的浏览器,不启用压缩 | |
URIEncoding | URL编码字符集 | |
allowTrace | 是否允许HTTP的TRACE方法,默认:false | |
emptySessionPath | 用户的所有路径是否设置为/(跟目录),默认为false | |
useBodyEncodingForURI | 是否用contentType中指定的编码来取代URIEncoding,默认:false | |
bufferSize | 连接器缓冲区的大小,单位:字节,默认缓存区大小:2048字节 | |
socketBuffer | Socket输出缓冲区的大小,单位:字节,默认:9000字节,-1:禁止缓冲 | |
threadPriority | JVM中请求处理线程优先级,默认:NORMAL-PRIORITY | |
useURIValidationHack | 是否检查不必要的URL,false:不检查,提升性能 | |
Engine | defaultHost | 默认接收的主机名称 |
name | Engine组件的名称,提供日志记录,名称不能和其他Engine冲突 | |
host | name | 主机名 |
appBase | 应用程序的目录,app的目录,可相对路径,也可绝对路径 | |
unpackWARs | 是否自动解压war包,true:不解压,false:解压 | |
autoDeploy | 是否自动部署war包 | |
xmlValidation | 是否启动xml的校验功能,一般不效验 | |
xmlNamespaceAware | 是否检测名称空间,一般不检测 | |
Values | directory | 日志保存的目录 |
prefix | 指定log文件的前缀 | |
suffix | 指定log文件的后缀 | |
pattern | 日志内容格式 | |
fileDateFormat | 自定义时间戳,作为日志suffix的前缀 | |
timestamp | 文件名是否加入系统时间戳,true:开启 | |
AccessLogValve | 访问日志Valve | |
ExtendedAccessValve | 扩展功能的访问日志Valve | |
JDBCAccessLogValve | 通过JDBC将访问日志,发送到数据库 | |
RequestDumperValve | 请求转储Valve | |
RemoteAddrValve | 基于远程地址的访问控制 | |
RemoteHostValve | 基于远程主机名的访问控制 | |
SemaphoreValve | 控制Tomcat主机任何容器的并发访问量 | |
JvmRouteBinderValve | 配置多个Tomcat,以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当停止某节点时,通过此Valve将请求定向至备用节点,使用此Valve,必须使用JvmRouteSessionIDBinderListener | |
ReplicationValve | 专用于Tomcat集群架构中,某个请求的session发生更改时,触发session数据在各节点间进行复制 | |
SingleSignOn | 将两个或多个需要对用户进行认证,webapp在认证用户时,即一次认证,可访问所有连接在一起的webapp | |
ClusterSingleSingOn | SingleSignOn的扩展,专用于Tomcat集群中,要结合ClusterSingleSignOnListener进行工作 | |
Context | docBase | webapp的war包目录,相对路径或绝对路径 |
path | webapp的url的前缀,url: http://localhost:8080/path/webapp | |
reloadable | 自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes | |
Realm | JAASRealm | 基于Java Authintication and Authorization Service实现用户认证 |
JDBCRealm | 通过JDBC访问某关系型数据库表实现用户认证 | |
JNDIRealm | 基于JNDI使用目录服务实现认证信息的获取 | |
MemoryRealm | 查找tomcat-user.xml文件实现用户信息的获取 | |
UserDatabaseRealm | 基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证 |
5、管理tomcat脚本
# vim tomcat.sh #!/bin/sh JAVA_HOME=/application/jdk CATALINA_HOME=/application/tomcat usage(){ echo "$0 {start|stop|restart}" exit 1 } [ $# -ne 1 ]&& usage start_tomcat(){ $CATALINA_HOME/bin/startup.sh } stop_tomcat(){ TPID=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}') kill -9 $TPID sleep 5; TSTAT=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}') if [ -z $TSTAT ];then echo "tomcat stop" else kill -9 $TSTAT fi cd $CATALINA_HOME rm temp/* -rf rm work/* -rf } case $1 in start) start_tomcat ;; stop) stop_tomcat ;; restart) stop_tomcat sleep 5 start_tomcat ;; *) usage ;; esac
四、Tomcat性能优化
1、内存优化
-server #以server模式运行(默认client模式) -Xms #初始堆内存大小 -Xmx #最大堆内存大小 –Xmn #年轻代大小(整个堆大小=年轻代大小+年老代大小+持久代大小) -XX:NewSize #设置年轻代大小(for 1.3/1.4版本) -XX:MaxNewSize #年轻代最大值(for 1.3/1.4) -XX:PermSize #设置持久代初始值 -XX:MaxPermSize #设置持久代最大值 -Xss #每个线程的堆栈大小(JDK版本5.0后,每个线程堆栈大小:1M) -XX:NewRatio #年轻代与年老代的比值 -XX:SurvivorRatio #Eden区与Survivor区的大小比值 -XX:LargePageSizeInBytes #内存页的大小,设置过大,会影响Perm的大小 -XX:+UseFastAccessorMethods #原始类型的快速优化(get,set方法转成本地代码) -XX:+DisableExplicitGC #关闭System.gc() -XX:MaxTenuringThreshold #垃圾最大年龄(该参数在串行GC时才有效) -XX:+AggressiveOpts #加快编译 -XX:+UseBiasedLocking #锁机制的性能改善 -XX:MetaspaceSize #Metaspace的初始大小 -XX:MaxMetaspaceSize #Metaspace的最大值 -Xnoclassgc #禁用垃圾回收 -XX:PretenureSizeThreshold #对象超过多大,直接在旧生代分配 -XX:TLABWasteTargetPercent #TLAB占eden区的百分比 -XX:+CollectGen0First #FullGC时是否先YGC 并行收集器 -XX:+UseParNewGC #对年轻代采用多线程并行回收(gc) -XX:ParallelGCThreads #并行收集器的线程数 -XX:+UseParallelOldGC #对年老代采用多线程并行回收(gc) -XX:MaxGCPauseMillis #每次年轻代垃圾回收的最长时间(最大暂停时间) -XX:+UseAdaptiveSizePolicy #自动选择年轻代区大小和相应的Survivor区比例 -XX:GCTimeRatio #垃圾回收占程序运行的时间百分比 -XXUseParallelGC #垃圾回收设置为并行收集器 CMS -XX:+UseConcMarkSweepGC #用CMS收集器对年老代进行GC,CMS收集器优势停顿时间少,适用停顿时间短的前台应用 -XX:+AggressiveHeap #用大量的物理内存,忽略Xmx参数 -XX:CMSFullGCsBeforeCompaction #多少次后进行内存压缩 -XX:+CMSParallelRemarkEnabled #开启降低标记停顿 -XX:+UseCMSCompactAtFullCollection #CMS收集器完成垃圾回收后,是否对年老代的压缩整理 -XX:+UseCMSInitiatingOccupancyOnly #用手动定义初始化开始CMS收集(指定阈值回收,不指定jvm会自动调整) -XX:CMSInitiatingOccupancyFraction=70 #年老代满70%开始CMS收集 -XX:CMSInitiatingPermOccupancyFraction #持久代满多少百分比,开始CMS回收 -XX:+CMSIncrementalMode #设置为增量模式(用于单CPU) -XX:+CMSClassUnloadingEnabled #在用CMS收集进行垃圾回收时,同时清理持久代不使用的class(类) -XX:ParallelCMSThreads #设定CMS的线程数 辅助信息 -XX:+PrintGC #输出JVM gc日志 -XX:+PrintGCDetails #输出JVM gc详情 -XX:+PrintGCTimeStamps #gc日志中输出GC的时间戳 -XX:+PrintGC:PrintGCTimeStamps #gc日志中输出GC的时间戳(混合模式) -XX:+PrintGCApplicationStoppedTime #输出垃圾回收期间,程序暂停的时间(可与上面一起用) -XX:+PrintGCApplicationConcurrentTime #输出每次垃圾回收前,程序未中断的执行时间(可与上面一起用) -XX:+PrintHeapAtGC #输出GC前后的详细堆栈信息 -XX:+PrintClassHistogram #输出实例的数量以及空间大小 -XX:+PrintTLAB #输出TLAB空间的使用情况 -XX:+PrintTenuringDistribution #输出每次minor GC后,新的存活周期的阈值 -verbose:gc #输出JVM gc日志 -Xloggc:${CATALINA_BASE}/logs/gc.log #指定gc日志目录 -XX:+PrintGCDateStamps #gc日志中输出GC的时间戳(日期格式: 2013-05-04T21:53:59.234+0800) -XX:+HeapDumpOnOutOfMemoryError #在发生OOM时dump堆内存便于排查问题 -XX:HeapDumpPath=${CATALINA_BASE}/logs #指定堆内存dump文件导出路径 -Djava.awt.headless=true #一般在最后,图表工具的展示
2、连接器优化
主要优化connector标签相关参数,用于处理用户的访问请求
1、通用配置 # vim server.xml <Connector port="8080" protocol="HTTP/1.1" #编码格式 URIEncoding="UTF-8" #线程配置 maxThreads="1000" maxProcessors="1000" minProcessors="5" minSpareThreads="100" maxSpareThreads="1000 #连接数配置 maxConnections="1000" connectionTimeout="20000" acceptCount="1000" enableLookups="false" disableUploadTimeout="true" useURIValidationHack="false" #启用压缩的配置 compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" #其他配置 maxPostSize="10485760" maxHttpHeaderSize="8192" tcpNoDelay="true" acceptorThreadCount="8" redirectPort="8443" /> 2、https配置示例 # vim server.xml <Connector port="8443" protocol="HTTP/1.1" URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/home/tomcat/ssl/test.jks" keystorePass="123456" />
3、线程池优化
1、配置 # vim server.xml <Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="100" useBodyEncodingForURI="true" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false" /> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> 2、参数详解 name #线程池名,在 Connector中指定 namePrefix #创建每个线程名的前缀,线程名: namePrefix + threadNumber maxThreads #线程池最大线程数 minSpareThreads #活跃线程数 maxIdleTime #线程空闲时间,默认:6000(1分钟),单位:毫秒 maxQueueSize #被执行前最大队列数,默认:Int的最大值,一般不用改 prestartminSpareThreads #启动线程池时是否启动minSpareThreads部分线程,默认:false(不启动) className #线程池实现类,默认实现类:org.apache.catalina.core.StandardThreadExecutor
4、优化IO模式
1、io模式介绍 BIO(阻塞型IO)、NIO、NIO2和APR 2、区别 BIO: BIO(Blocking I/O),阻塞式I/O,使用传统的Java I/O操作(java.io包及其子包),默认:bio模式,性能低,连接数少 NIO: NIO(New I/O),基于缓冲区,非阻塞I/O,提供java API(java.nio包及其子包),并发高,适合连接数多且短(聊天),后台耗时完成请求的操作 APR: APR(Apache Portable Runtime)JNI调用HTTP动态库处理文件,提高静态文件和SSL的处理,连接数多且长(相册),从系统层面解决IO堵塞 3、修改io模式 <Connector port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/> protocol="HTTP/1.1" #BIO protocol="org.apache.coyote.http11.Http11NioProtocol" #NIO protocol="org.apache.coyote.http11.Http11Nio2Protocol" #NIO2 protocol="org.apache.coyote.http11.Http11AprProtocol" #APR
5、监听器优化
1、Listener配置
预防JRE内存泄漏,默认无需配置 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
6、优化总结
1、如何分配JVM的内存空间 2、应该使用什么类型的垃圾回收器 JVM产生的垃圾需要回收、回收有不同的回收器,JVM的调优需要了解各个垃圾回收机制的原理 终极目标: 降低FULL GC出现的频率(FULL GC出现会导致应用的暂停服务)
五、监控Tomcat
1、使用jconsole来监控jvm
1、安装jconsole 在Windows平台安装jconsole图形化软件 2、配置tomcat的远程连接 # vim bin/catalina.sh CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote #启用远程监控JMX -Dcom.sun.management.jmxremote.port=12345 #jmx远程端口 -Dcom.sun.management.jmxremote.authenticate=false #不开启用户密码认证 -Dcom.sun.management.jmxremote.ssl=false #不开启ssl(https) -Djava.rmi.server.hostname=192.168.230.130" #tomcat的IP地址
3、单击java目录bin下的JConsole.exe可执行文件
QQ:328864113 微信:wuhg2008