在Java的开发过程中,部署war包的时候经常需要用Tomcat,通常只会用到webapps、conf下的server.xml和bin下的startup.bat(Windows环境) 其中,将war包放入webapps包下,手动更改server.xml中的配置(如端口等),cmd到bin目录下,进行startup.bat进行启动项目。
但是,其他包、其他文件又是干什么的呢?有什么作用呢? 接下来,便记录下apache-tomcat-9.0.30文件夹下各文件夹及文件的作用。
一、文件夹及文件的作用 二、server.xml conf 包下的server.xml,维护服务的基础配置,通过修改各组件,进行修改对服务的访问、性能等调整。 从官网下载下来的文件压缩包解压后的默认文件组成(去除了注释)
<?xml version="1.0" encoding="UTF-8"?> <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 name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <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>接下来是对各组件及要素的描述 三、Tomcat部署Web项目的3种方式 1.将war包丢进webapps 如上所示,最开始webapps包下只有war包,通过startup.bat运行后,自动解压生成了解压包。 2.配置Server.xml部署Web工程
<Context docBase="D:\test\GK_Data" path="/GK_Data" reloadable="false" />docBase:web工程的绝对路径; path:对外访问路径; reloadable:true的时候实现Tomcat在检测到class文件发生变化之后,对WebApp的应用进行了重新加载:先卸载,再重新加载。 3.添加xml方式部署Wweb工程 在G:\tools\apache-tomcat-9.0.30\conf\Catalina\localhost下添加xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <Context docBase="D:\test\dubbo-admin-2.5.10" reloadable="false" />四、Tomcat优化 1.内存优化
JVM:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k" JAVA_OPTS 顾名思义,是用来设置JVM相关运行参数的变量。 -server 一定要作为第一个参数,在多个CPU时性能佳 -Xms 初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些 -Xmx Java Heap最大值,使用的最大内存 -XX:PermSize 设定内存的永久保存区域 -XX:MaxPermSize 设定最大内存的永久保存区域 -XX:MaxNewSize Tomcat对自身堆栈的新的最大的分配,当Tomcat内存不足时,调用此分配 -Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k. +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。 -Xss 每个线程的Stack大小 -verbose:gc 现实垃圾收集信息 -Xloggc:gc.log 指定垃圾收集日志文件 -Xmn Young Generation的heap大小,一般设置为Xmx的3、4分之一 -XX:+UseParNewGC 缩短minor收集的时间 -XX:+UseConcMarkSweepGC 缩短major收集的时间(此选项在Heap Size比较大而且Major收集时间较长的情况下使用更合适)2.线程优化 server.xml --> Server --> Service --> Connector
Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" /> maxThreads="600" Tomcat启动的最大线程数,即同时处理的任务个数,默认值为200 minSpareThreads="100" 初始化时创建的线程数,连接器还将确保它有指定数量的空闲处理线程可用,默认为4 maxSpareThreads="500" 允许存在的最大未使用请求处理线程数,直到线程池开始停止不必要的线程。默认值为50。 acceptCount="700" 当Tomcat启动的线程数达到最大时,接受排队的请求个数,默认值为100其中maxThreads 和 acceptCount
情况1:接受一个请求,此时Tomcat启动的线程数没有到达maxThreads,Tomcat会启动一个线程来处理此请求。 情况2:接受一个请求,此时Tomcat启动的线程数已经到达maxThreads,Tomcat会把此请求放入等待队列,等待空闲线程。 情况3:接受一个请求,此时Tomcat启动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时Tomcat会直接拒绝此次请求,返回connection refused。 1.maxThreads 如果是纯粹的计算,maxThreads应适当小,降低同一时间抢夺cpu的个数,可以提高计算效率; 如果是IO或数据库等,maxThreads应适当大,提高同一时间请求的个数,可以提高效率。但是,线程数多的情况下会消耗过多的线程切换的时间,在达到一定不仅不会提高效率,反而会降低效率,甚至是请求超时。 特别地,当cpu核心数<线程数时,cpu就需要在多个线程直接来回切换,以保证每个线程都会获得cpu时间,即通常我们说的并发执行。这样cpu就会在线程切换上浪费时间。 2.acceptCount 如果设的较小,可以保证接受的请求较快相应,但是超出的请求可能就直接被拒绝; 如果设的较大,可能就会出现大量的请求超时的情况,因为我们系统的处理能力是一定的。3.禁用DNS查询 server.xml --> Server --> Service --> Connector
<Connector port="8080" protocol="HTTP/1.1" enableLookups="false" connectionTimeout="20000" redirectPort="8443" /> enableLookups 如果为true时,会进行DNS(域名解析协议:Ip地址解析为主机名)查询,DNS查询需要占用网络; 如果为false时,关闭enableLookups,只会返回ip,就不会去进行DNS查询4.设置session过期时间 在 web.xml中设置session的过期时间
<session-config> <session-timeout>180</session-timeout> //单位为分钟 </session-config>5.使用Tomcat Native提高性能
Apache可移植运行时( Apache Portable Runtime,简称APR)是Apache HTTP服务器的支持库,提供了一组映射到下层操作系统的API。如果操作系统不支持某个特定的功能,APR将提供一个模拟的实现。这样程序员使用APR编写真正可在不同平台上移植的程序。 tomcat-native 库为 Tomcat 提供了本地实现。 tomcat-native 依赖于三个组件:APR, OPENSSL, JDK。 大致思路就是通过 tomcat-native 库,使tomcat运行时通过APR更多的调用本地API,达到提升性能的目的。由于依赖关系,安装时,先安装 APR, OPENSSL, 然后再安装 tomcat-native, 最后配置 tomcat 启动时依赖的库路径。到目前为止先这么多,如果有错误之处,请指教。