文档章节

Tomcat参数配置

贾峰uk
 贾峰uk
发布于 2017/05/08 23:20
字数 2440
阅读 29
收藏 2

1. JAVA_OPTS内存优化

Tomcat内存优化主要是对启动参数的优化,可以在Tomcat的启动脚本catalina.sh中设置JAVA_OPTS参数。

-server  启用jdk 的 server 版;  
    -Xms    java虚拟机初始化时的最小内存;  
    -Xmx   java虚拟机可使用的最大内存;

配置完成后重启Tomcat,通过以下命令查看配置是否生效。

1.首先查看Tomcat进程号

ps -ef|grep java;进程号22222

2.通过进程号查看配置是否生效

sudo jmap -heap 22222

2. server.xml优化

Tomcat的主要配置文件,该配置中包含很多元素service、host、connector等。

<Server>
  <Listener />
  <GlobaNamingResources>
  </GlobaNamingResources
  <Service>
    <Connector />
    <Engine>
      <Logger />
      <Realm />
      <host>
         <Logger />
         <Context />
      </host>
    </Engine>
  </Service>
</Server>

maxThreads 客户请求最大线程数,默认200

minSpareThreads Tomcat初始化时创建的 socket 线程数

maxSpareThreads Tomcat连接器的最大空闲 socket 线程数

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75

acceptCount:允许的最大连接数,应大于等于 maxProcessors ,默认值为 100

enableLookups:是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false

redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口

acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )

connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为30000 毫秒。

URIEncoding URL统一编码

其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。

<Connector port="9027"   
                protocol="HTTP/1.1"  
                maxHttpHeaderSize="8192"  
                maxThreads="1000"  
                minSpareThreads="100"  
                maxSpareThreads="1000"  
                minProcessors="100"  
                maxProcessors="1000"  
                enableLookups="false"  
                URIEncoding="utf-8"  
                acceptCount="1000"  
                redirectPort="8443"  
                disableUploadTimeout="true"/>

maxThreads 和acceptCount生效情况

maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200

acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。

情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。

情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求,返回connection refused

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="800" acceptCount="1000"/>

 

3. 多个虚拟机

强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat,而不是启动一个 Tomcat 里面包含多个虚拟主机。因为 Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全。

4. 压缩传输

tomcat作为一个应用服务器,也是支持 gzip 压缩功能的。我们可以在 server.xml 配置文件中的 Connector 节点中配置如下参数,来实现对指定资源类型进行压缩。

compression="on"             # 打开压缩功能 
compressionMinSize="50"      # 启用压缩的输出内容大小,默认为2KB 
noCompressionUserAgents="gozilla, traviata"      # 对于以下的浏览器,不启用压缩 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些资源类型需要压缩

Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML、CSS、Javascript和Text,它可以节省40% 左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。但是, 压缩会增加 Tomcat 的负担,因此最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,将压缩的任务交由 Nginx/Apache 去做。

Tomcat是根据浏览器请求头中的accept-encoding来判断浏览器是否支持 压缩功能,如果这个值包含有gzip,就表明浏览器支持gzip压缩内容的浏览

5. 管理AJP端口

AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。

<!--
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

6. 更改关闭 Tomcat 实例的指令

server.xml中定义了可以直接关闭 Tomcat 实例的管理端口。我们通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。因此我们需要将关闭指令修改复杂一点。

当然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,因此大家也不必担心。除非黑客登陆到tomcat本机去执行关闭操作。

<Server port="8005" shutdow n="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">

7. 更改 Tomcat 的服务监听端口

一般公司的 Tomcat 都是放在内网的,因此我们针对 Tomcat 服务的监听地址都是内网地址。

<Connector port="8080" address="172.16.100.1" />

8. 关闭war自动部署

默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。

<Host name="localhost"  appBase=""
            unpackWARs="false" autoDeploy="false">

9. Tomcat性能优化

1.配置Tomcat运行内存;2.利用缓存和压缩《利用nginx加速web访问》;3.采用集群《利用nginx+tomcat+memcached组建web服务器负载均衡》4.Tomcat的参数优化;5.改用APR库

tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。

<Connector port="80" protocol="HTTP/1.1"        connectionTimeout="20000"         redirectPort="8443" />

修改为

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol "   connectionTimeout="20000"     redirectPort="8443" />

NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重启即可生效。上面配置我已经改过了,默认的是HTTP/1.1。

APR则需要安装第三方库,在高并发下会让性能有明显提升。

Tomcat的四种基于HTTP协议的Connector性能比较

<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"                           connectionTimeout="20000" redirectPort="8443"/>
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"
               redirectPort="8443"/> 
<Connector executor="tomcatThreadPool"
               port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
<Connector executor="tomcatThreadPool"
               port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />

Connector按照顺序命名为 NIO, HTTP, POOL, NIOP

NIO HTTP POOL NIOP

281 65 208 365
666 66 110 398
692 65 66 263
256 63 94 459
440 67 145 363

10. 使用 Server JRE 替代JDK

服务器上不要安装JDK,请使用 Server JRE. 服务器上根本不需要编译器,代码应该在Release服务器上完成编译打包工作。

理由:一旦服务器被控制,可以防止在其服务器上编译其他恶意代码并植入到你的程序中。

11. Tomcat 安全配置

1. 禁用Tomcat管理页面,删除webapps下面的所有代码,删除conf/Catalina/localhost/下的host-manager.xml和manager.xml这两个文件。

rm -rf /srv/apache-tomcat/webapps/*

2. 注释或删除 tomcat-users.xml 所有用户权限

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>

3. 隐藏Tomcat版本信息

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
				maxThreads="8192"
				minSpareThreads="64"
				maxSpareThreads="128"
				acceptCount="128"
				enableLookups="false"
                server="Neo App Srv 1.0"/>

4. 启动用户与端口

创建一个用户,这个用户只用于启动Tomcat

groupadd -g 80 daemon
adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
chown daemon:daemon -R /srv/*
su - daemon -c "/srv/apache-tomcat/bin/startup.sh"

应用程序的部署和Tomcat启动不能使用同一用户(tomcat被植入web shell程序时,不能创建或编辑应用程序目录下任何内容)

5. 关闭自动部署

unpackWARs="false" autoDeploy="false";防止被植入木马等恶意程序

6. JSESSIONID

修改 Cookie 变量 JSESSIONID, 这个cookie 是用于维持Session关系。建议你改为PHPSESSID。

7. 超时自动退出

查看tomcat配置文件server.xml是否有设置connectionTimeout值,设置账户自动登出。

session超时失效设置

<session-config>  
        <session-timeout>30</session-timeout>  
</session-config> 

8. 自定义错误页面

<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500.html</location>
</error-page>

9. 禁止列目录(高版本默认已禁止)

编辑tomcat/conf/web.xml配置文件

<init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
</init-param>

当WEB目录中没有默认首页如index.html,index.jsp等文件时,不会列出目录内容,直接访问http://ip:8800/webadd。

10. 配置httponly

可在conf/context.xml配置文件中配置

<Context useHttpOnly="true"></context>

并且修改tomcat/conf/web.xml配置文件

<session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
</session-config>

11. 配置cookie加密传输

在web.xml中sesion-config节点配置cookie-config中secure属性,此配置只允许cookie在加密方式下传输。只有当使用https协议连接时cookie才可以被页面访问.

<session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
            <secure>true</secure>
        </cookie-config>
</session-config>

12. HTTPS加密协议

<Connector port="8443" 
           protocol="org.apache.coyote.http11.Http11Protocol" 
           maxThreads="150" 
           SSLEnabled="true" 
           scheme="https" 
           secure="true" 
           clientAuth="false" 
           sslProtocol="TLS" />

 

© 著作权归作者所有

贾峰uk
粉丝 2
博文 96
码字总数 159021
作品 0
深圳
私信 提问
在Intellij下远程调试tomcat应用(含tomcat源码调试)

环境 服务器: 操作系统:centos6 jdk:1.7 tomcat:8.5.9 本地: 操作系统:mac osx 10.11.6 jdk:1.7 intellij:2016.2 tomcat:8.5.9(本地也需要下载tomcat) 应用调试步骤 java应用远程...

wooyoo
2017/01/23
0
0
九爷带你了解 Tomcat 优化

如何优化tomcat配置(从内存、并发、缓存4个方面)优化 [+] Tomcat有很多方面,我从内存、并发、缓存四个方面介绍优化方法。    一.Tomcat内存优化   Tomcat内存优化主要是对 tomcat 启动参...

李伟铭k
2018/07/09
0
0
Jenkins之UTF-8编码问题-yellowcong

Jenkins有时候就是容易抽筋,我在Tomcat配置了编码,就是不好使,我开始是因为nginx的反向代理的毛病,后来才发现,然后是tomcat作妖了,解决办法,就是拷贝我的tomcat配置,然后在我的基础上...

yelllowcong
2018/04/21
0
0
如何优化tomcat配置(从内存、并发、缓存4个方面)优化

Tomcat有很多方面,我从内存、并发、缓存四个方面介绍优化方法。   ** 一.Tomcat内存优化 **   Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.s...

holy2009
2017/07/18
0
0
Tomcat 简单配置(JAVA8 VM Args)

Tomcat用了two years+,没有深究过配置信息,只是简单的改改端口,最近在搭建测试Server的时候,单机有四个Tomcat实例,发现8G的内存不知不觉的就被用完了,甚至是20G的硬盘都被一次意外吃完...

Geek-S
2016/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
4分钟前
1
0
Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部