tomcat默认配置已能满足正常需求,为了优化服务可以进行以下的简单设置。
以下配置针对tomcat8。
1. 设置Connector(server.xml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="30000" acceptCount="1024" maxThreads="1024" minSpareThreads="16" acceptorThreadCount="4" URIEncoding="UTF-8" useURIValidationHack="false" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443" />
|
acceptCount: 等待处理队列的最大长度,超过该数目的后续请求将被refuse
maxThreads: 处理任务的最大线程数,即同时能够处理的最大任务数目
minSpareThreads: 保留的最少空闲线程数
acceptorThreadCount: 接受连接(socket accept调用)的线程数,默认为1,通常设置为cpu核心数
protocol=”HTTP/1.1”: java http connector协议。
tomcat8标准连接器包括BIO阻塞模式,非阻塞NIO1,非阻塞NIO2和ARP/Native四种模式。
1 2 3 4
| protocol="org.apache.coyote.http11.Http11Protocol" - blocking Java connector protocol="org.apache.coyote.http11.Http11NioProtocol" - non blocking Java NIO connector protocol="org.apache.coyote.http11.Http11Nio2Protocol" - non blocking Java NIO2 connector protocol="org.apache.coyote.http11.Http11AprProtocol" - the APR/native connector.
|
当使用protocol=”HTTP/1.1”时,如果PATH(windows)或LD_LIBRARY_PATH(linux)路径下,存在tomcat native库,则使用APR/native模式;否选使用一种NIO模式。
实际部署中,建议设置protocol=”HTTP/1.1”。
各个模式具体说明见官方链接。
这里主要调整acceptCount/maxThreads这几个参数,提高并发处理能力,同时对文本文件进行压缩(compression=on)。
2. nginx前端+tomcat后端的配置
首先, nginx作为反向代理前端,需要设置将用户信息传送到tomcat。
1 2 3 4 5 6 7 8
| location / { proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Cookie $http_cookie; proxy_pass http://tomcat; }
|
其次,tomcat将这些真实用户信息写到日志中(默认是代理nginx的信息)(server.xml)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" remoteIpProxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />
<Context path="/" docBase="" debug="0" privileged="true" reloadable="false"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" resolveHosts="false" pattern="%h %l %u %t "%r" %s %b %{x-forwarded-for}i" />
</Host>
|
这里存在另一个细节,在产品部署中建议设置reloadable=”false”以提高tomcat性能。
3. tomcat启动设置
tomcat使用的是java默认参数,实际部署中可以根据系统的具体性能进行调整,如下所示将其添加到tomcat的启动脚本catalina.sh和daemon.sh中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| JAVA_OPTS="-server -Xms512M -Xmx4096M -XX:LargePageSizeInBytes=128m -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom "
|
-Xms: 初始化内存
-Xmx: 最大内存
-Xss: 线程栈大小,无需设置
-XX:+AggressiveOpts: JVM性能优化,加快编译
-XX:+UseBiasedLocking: JVM lock优化
-XX:LargePageSizeInBytes=128m: 堆的内存页大小
-XX:+DisableExplicitGC: 关闭系统System.gc()
-Djava.awt.headless=true: headless模式,适于server程序,无鼠标/显示/键盘等。
-Djava.security.egd=file:/dev/./urandom: 默认/dev/random是block模式,针对大并发有性能影响,若对随机数要求不高则用伪随机代替(使用file:/dev/./urandom,不是file:/dev/urandom)。
更多的优化服务设置,请参照官方文档。