Tomcat 配置

Tomcat 功能说明与配置说明.

理论基础

Tomcat服务安装启动

  • 1.官网下载JDK与Tomcat直接解压,JDK7对应Tomcat7,JDK8对应Tomcat8

配置

JAVA_HOME配置

windows setclasspath.bat文件最前面加上:

1
2
set JAVA_HOME=D:\java\jdk1.8.0_171
set JRE_HOME=D:\java\jdk1.8.0_171\jre

linux setclasspath.sh文件最前面加上:

1
2
JAVA_HOME="/usr/local/java/jdk1.8.0_171"
JRE_HOME="/usr/local/java/jdk1.8.0_171/jre"

Tomcat 7.0.100.0 Log4j配置,对tomcat大日志进行切割

  1. $CATALINA_BASE/lib目录创建log4j.properties文件注意里面语法与包路径不同版本会有所区别具体参考官方文档,添加log4j.jar必须v1.2.x版本
  2. 去官网下载扩展组件Extras:tomcat-juli.jar和tomcat-juli-adapters.jar到lib目录,复制tomcat-juli.jar到bin目录
  3. 删除logging.properties
  4. 启动tomcat

配置资源gzip压缩

1
2
3
4
5
6
7
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="9000" maxThreads="1000" acceptCount="2000"
redirectPort="8443" maxHttpHeaderSize="8192"
compression="on"
compressionMinSize="1024"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,text/json,application/css,application/javascript,application/json"/>

compression=”on” 开启压缩。可选值:”on”开启,”off”关闭,”force”任何情况都开启
compressionMinSize=”2048”大于2KB的文件才进行压缩,默认2048B。如果配置不合理,产生的后果是小文件压缩后反而变大了,达不到预想的效果
noCompressionUserAgents=”gozilla, traviata”,对于这两种浏览器,不进行压缩
compressableMimeType=”text/html,text/xml,application/javascript,text/css,text/plain,text/json”会被压缩的MIME类型列表,多个逗号隔,表明支持html、xml、js、css、json等文件格式的压缩

Connector 参数说明

  • port 指定端口accept客户端的链接
  • protocol “HTTP/1.1”是默认值,等效于”org.apache.coyote.http11.Http11Protocol”,在Tomcat 6.0之后,还提供了NIO的方式,可以有效的提升性能,特别是在大量长连接/数据上传+下载等web应用中.此时portocal=”org.apache.coyote.http11.Http11NioProtocol”
    BIO:JDK 1.5+,tomcat 5.x+
    NIO:JDK 1.6+,tomcat 6.x+
    NIO2:JDK 1.7+,tomcat 7.x+
  • maxParameterCount http-get请求中允许传递的查询字符串的最大个数,”-1”表示无限制,为了安全和规范,maxHeaderCount和maxParamterCount通常应该合理,建议设置为100等;如果请求参数再多,那么就建议使用post body发送或者拆分请求
  • maxPostSize http-post请求中数据(body)的最大尺寸,单位:byte,默认值为2M
  • URIEncoding http-get请求中,使用何种字符集对查询字符串进行编码,默认为”iso-8859-1”
  • useBodyEncodingForURI 是否使用”Content-type”中指定的编码方式对http-get请求中查询字符串进行编码.如果为”true”,将会忽略”URIEncoding”配置项,转而使用header中”content-Type”指定的编码方式
  • maxThreads 用于接收和处理client端请求的最大线程数,默认200,太大的值,并不能提升NIO性能,反而会使性能下降,因为线程切换(CS)将会占据CPU的大量时间
  • compression 是否对http相应数据启用Gzip压缩
  • acceptCount 当tomcat请求处理线程池中的所有线程都处于忙碌状态时,此时新建的链接将会被放入到pending队列,acceptCount即是此队列的容量,如果队列已满,此后所有的建立链接的请求(accept),都将被拒绝。默认为100。在高并发/短链接较多的环境中,可以适当增大此值;当长链接较多的场景中,可以将此值设置为0.
  • address 当物理server上绑定了多个IP地址时,可以通过“address”来指定tomcat-server需要bind的地址.默认将port关联到所有的ip上
  • bufferSize 链接在读取stream时,buffer数据的尺寸
  • connectionLinger socket linger参数值。当socket即将关闭时(前)阻塞的时间,单位:秒。如果设置为-1,表示关闭linger。在BIO(Blocking IO)和AJP链接中默认为100,NIO中默认为25
  • keepAliveTimeout 当无实际数据交互时,链接被保持的时间,单位:毫秒。在未指定此属性时,将使用connectionTimeout作为keepAliveTimeout。对于HTTP请求,server端为了支撑较高的吞吐量,不可能无限制的keepAlive一个链接(在设计要求上,这个和TCP通讯有本质的区别),keepAliveTimeout超时后,将会导致链接关闭。如果此tomcat设计为“长链接”服务,可以适当增加keepAliveTimeout值,否则无需设置此值。不过我们通常在tomcat上层还有nginx等代理服务器,我们通常希望链接keepAlive的机制由代理服务器控制,比如nginx来决定链接是否需要“保持活性”(注意,与keep_alive不同),当然nginx服务器只会保留极少的长连接,几乎所有的链接都会在使用结束后主动close;因为链接复用层,将有nginx与client保持,而不再是tomcat与client保持。太多的keepAlive链接,尽管提高了链接使用效率,但是对负载均衡不利。
  • maxKeepAliveRequests tomcat需要保持的最大请求数,即处于keepAlive状态的请求的个数,建议此值为maxThreads * 0.5,不得大于maxThreads,否则将得不到预期的效果。-1表示不限制,1表示关闭keepAlive机制。
  • maxConnections tomcat允许接收和处理的最大链接数,对于BIO而言此值默认与maxThreads参数一样,对于NIO而言此值默认为10000。
  • acceptorThreadCount 默认为1,表示用于accept新链接的线程个数,如果在多核CPU架构下,此值可以设置为2,官方不建议设定超过2个的值。
  • maxHttpHeaderSize http头的最大尺寸,默认为8192,单位为“字节”。
  • minSpareThreads 线程池中,保持活跃的线程的最小数量,默认为10
  • SSLEnabled 是否开启ssl支持,默认为false;通常SSL应该在nginx等代理层,我们不应该让tomcat直接接入
  • pollerThreadCount 表示用于polling IO事件的线程个数,默认为1。NIO
  • useSendfile 是否开启sendfile特性,默认为true。对于web应用而言,通常project中还会包含一定数量的静态资源,比如图片、CSS、js、html等,sendfile在一定程度上可以提高性能。NIO
  • selectorTimeout 选择器阻塞的时间,如果你进行过NIO开发,应该知道此参数的含义,默认值为1000毫秒。此值不要太大,因为selector线程本身还需要用来清理已关闭的链接等。NIO
  • selectorPool.maxSelectors:NIO中选择的个数,默认值为200。NIO

redhat6开机自启动

  • cd /etc/init.d
  • vi tomcat8-xxx-spi 拿catalina.sh改也行,加上前面9行。不想显示tomcat8还可以根据自己需求修改成其他名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/bash
    # description: Tomcat Start Stop Restart
    # processname: tomcat
    # chkconfig: 234 20 80
    JAVA_HOME=/usr/java/jdk1.8.0_131
    export JAVA_HOME
    PATH=$JAVA_HOME/bin:$PATH
    export PATH
    CATALINA_HOME=/home/infotech/project/xxx-spi-xxx-8888

    case $1 in
    start)
    sh $CATALINA_HOME/bin/startup.sh
    ;;
    stop)
    sh $CATALINA_HOME/bin/shutdown.sh
    ;;
    restart)
    sh $CATALINA_HOME/bin/shutdown.sh
    sh $CATALINA_HOME/bin/startup.sh
    ;;
    esac
    exit 0
  • chmod 755 tomcat8-xxx-spi

  • chkconfig --add tomcat8-xxx-spi
  • chkconfig --level 234 tomcat8-xxx-spi on
  • chkconfig --list tomcat8-xxx-spi

centos7开机自启动

  • 系统(/user/lib/systemd/system/)、用户(/etc/lib/systemd/user/)
  • vi /usr/lib/systemd/system/tomcat-test.service 新建一个tomcat-test服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [Unit]
    Description=tomcat
    After=syslog.target network.target # 在指定服务后运行

    [Service]
    #User=infotech # 运行用户
    Type=forking # 后台运行,simple(默认值)

    #PIDFile=/home/infotech/project/tomcat-test-8888/tomcat-test.pid # 开启后必须在catalina.sh加入CATALINA_PID
    #Environment="JAVA_HOME=/usr/java/jdk1.8.0_131" # 设置环境变量

    WorkingDirectory=/home/infotech/project/tomcat-test-8888/
    ExecStart=/home/infotech/project/tomcat-test-8888/bin/startup.sh
    ExecStop=/home/infotech/project/tomcat-test-8888/bin/shutdown.sh
    ExecReload=/bin/kill -s HUP $MAINPID
    RemainAfterExit=yes

    [Install]
    WantedBy=multi-user.target # 多用户模式启动
  • 如果设置了PIDFile需要在tomcat bin/catalina.sh中加入CATALINA_PID参数

    1
    2
    3
    4
    5
    6
    CATALINA_PID=/home/infotech/project/tomcat-test-8888/tomcat-test.pid

    # OS specific support. $var _must_ be set to either true or false.

    cygwin=false
    ...
  • systemctl daemon-reload 使服务生效

  • systemctl enable tomcat-test.service 设置为开机启动
  • systemctl start tomcat-test.service 启动服务
  • systemctl status tomcat-test.service 监测服务状态
  • systemctl list-units --type=service 显示已启动服务

参考