tomcat相关配置技巧梳理

时间:2024-07-22 15:03:38

1)默认站点根目录                                                                                                                                   
tomcat的默认站点根目录是webapps/ROOT,配置文件是server.xml,
配置文件server.xml 里的主要内容是:

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml       //如若修改tomcat的访问端口,替换下面的8080即可
.....
<Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" //URIEncoding="UTF-8"这个配置在这里默认是没有的,这里是我手动添加的,保证tomcat的编码是UTF-8
connectionTimeout="20000"
redirectPort="8443" />
.....
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
.....

上面配置说明tomcat的访问地址是http://localhost:8080
站点目录是/Data/app/tomcat-7/webapps/ROOT
记住提前将webapps目录清空,然后注意:
如果代码的war包名称是ROOT.war,那么tomcat重启后,访问站点的根目录就是webapps/ROOT,访问url是http://localhost:8080 (ROOT目录,在访问时的url中可以省略)
如果代码的war包名次不是ROOT.war,比如是jenkins.war,那么tomcat重启后,访问站点的根目录就是webapps/jenkins,访问url就是http://localhost:8080/jenkins (非ROOT目录,在访问时的url中必须要带上)

[root@huanqiu-test ~]# ll /usr/local/tomcat7/webapps/
total 62180
drwxr-xr-x. 16 root root 4096 Dec 15 12:33 jenkins
-rw-r--r--. 1 root root 63664946 Oct 30 20:38 jenkins.war

因此这个tomcat站点访问地址是:http://localhost:8080/jenkins

2)修改默认域名                                                                                                                                       
如下,只修改"Host name"处,将默认的localhost修改为www.wangjenkins.com
那么此tomcat站点访问地址是:http://www.wangjenkins.com:8080/jenkins/

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml
.....
<Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
.....
<Host name="www.wangjenkins.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
.....

3)修改tomcat访问的默认站点目录                                                                                                          
如下配置,重启tomcat后,它就会把起先默认站点目录/Data/app/tomcat-7/webapps/ROOT修改成/home/tomcat/www这个目录。

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml
.....
<Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
.....
<Host name="www.wangjenkins.com" appBase="/home/tomcat/www" //这里的appBase后填写的是新的站点根目录,也可以还设置成webapps(若是webapps,则下面的Context一行必须设置)
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" /> //这一行最好添加上,path后面的""里配置的是tomcat的子项目,""为空,表示是父项目
.....

[root@huanqiu-test ~] # ll /home/tomcat/www/
total 62180
drwxr-xr-x. 9 root root 4096 Dec 15 13:42 jenkins
-rw-r--r--. 1 root root 63664946 Dec 15 13:42 jenkins.war

[root@huanqiu-test ~] # ll /usr/local/tomcat7/webapps/
total 62184
drwxr-xr-x. 7 root root 4096 Dec 15 14:34 jenkins

这个tomcat站点访问地址是:http://www.wangjenkins.com:8080/jenkins

注意:
1)上面的appBase可以配置成新的站点目录,这时下面的Context这一行配置可以不加。默认站点目录webapps下还是会产生代码目录,只是tomcat访问的时候不会去调用它。
2)上面的appBase可以配置成默认的webapps站点目录,这种情况下,就必须添加Contest这一行,并在Context行内配置新的站点目录。tomcat启动后,解压代码的war包会往webapps这个默认站点目录里也产生一份(即新站点目录和默认的webapps站点目录都会有一份代码),只是tomcat访问时不会去调用webapps目录下的代码;
3)Context这一行是tomcat的项目配置,path后的""内填写的是项目名称,如果""为空,则表示是父项目。Context这一行的配置:
     在appBase配置成新的站点目录的情况下可有可无(不过建议最好还是配置上)
     在appBase配置成默认的webapps目录的情况下就必须要有!

所以配置也可以是:
       <Host name="www.wangjenkins.com" appBase="/home/tomcat/www"
                 unpackWARs="true" autoDeploy="true">
也可以是:
      <Host name="www.wangjenkins.com" appBase="webapps"
                unpackWARs="true" autoDeploy="true">
      <Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" />

4)部署多个项目                                                                                                                                       
1.在同一个tomcat下(即同一个端口)有两种方式:
   1)共用同一个域名(同一Host name)下的多个子项目
   2)不同域名(多个Host name)下的项目

tomcat多项目部署,需要用到下面一行:
<Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" />
其中,path后的""内填写的是项目名称,如果""为空,则表示是父项目(父项目情况下,这个Context行可以省略)

同一个域名下的多项目部署,配置如下:
[root@huanqiu-test ~]# vim /usr/local/tomcat7/conf/server.xml //Context行的位置放在"className"区域的下面
.......
      <Host name="www.wangjenkins.com" 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 &quot;%r&quot; %s %b" />
     <Context path="/huanqiu1" reloadable="true" docBase="/usr/local/tomcat7/huanqiu1"/>
     <Context path="/huanqiu2" reloadable="true" docBase="/usr/local/tomcat7/huanqiu2"/>
</Host>
......

上面的配置可知:
父项目是http://www.wangjenkins.com/8080/jenkins,站点目录是/usr/local/tomcat7/webapps,由于webapps下不是默认的ROOT,而是jenkins。所以访问的url里要带jenkins
两个子项目分别是:
http://www.wangjenkins.com/8080/huanqiu1,对应的站点目录是/usr/local/tomcat7/huanqiu1
http://www.wangjenkins.com/8080/huanqiu2,对于的站点目录是/usr/local/tomcat7/huanqiu2

不同域名下的多项目部署,配置如下:
[root@huanqiu-test ~]# vim /usr/local/tomcat7/conf/server.xml
......
      <Host name="localhost" appBase="webapps"                        //这个是默认的配置区域
                unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
          Documentation at: /docs/config/valve.html -->
     <!--
     <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
     -->

<!-- Access log processes all example.
           Documentation at: /docs/config/valve.html
           Note: The pattern used is equivalent to using pattern="common" -->
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="localhost_access_log." suffix=".txt"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

<Host name="www.beijing.com" appBase="apps"
                unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
               Documentation at: /docs/config/valve.html -->
       <!--
       <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
       -->

<!-- Access log processes all example.
              Documentation at: /docs/config/valve.html
              Note: The pattern used is equivalent to using pattern="common" -->
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                  prefix="localhost_access_log." suffix=".txt"
                  pattern="%h %l %u %t &quot;%r&quot; %s %b" />

<Host name="www.wangshibo.com" appBase="wang"
                 unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
               Documentation at: /docs/config/valve.html -->
       <!--
       <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
       -->

<!-- Access log processes all example.
              Documentation at: /docs/config/valve.html
              Note: The pattern used is equivalent to using pattern="common" -->
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log." suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       <Context path="/ops1" reloadable="true" docBase="/data/web/ops1"/>
       <Context path="/ops2" reloadable="true" docBase="/data/web/ops2"/>

根据上面的配置可知:
http://localhost:8080 对应的站点目录是/usr/local/tomcat7/webapps(假设对应站点目录下的名称都是ROOT)
http://www.beijing.com:8080 对应的站点目录是/usr/local/tomcat7/apps
http://www.wangshibo.com:8080 对应的站点目录是/usr/local/tomcat7/wang,并且这个项目下有两个子项目分别是http://www.wangshibo.com:8080/ops1、http://www.wangshibo.com:8080/ops2

2.在不同的tomcat下(不同的端口)
将tomcat复制成多个副本,然后根据业务更改复制后的tomcat名,修改server.conf中的三个关键端口(下面会提到).注意站点目录对应关系。
[不过,为了避免不必要的麻烦,最好还是别复制已经在使用中的tomcat,可以重新解压tomcat安装包进行使用(将其备份,以待后续再使用)].当然也可以在不同端口的tomcat下设置各自的子项目。
                                                                                                                                           
需要注意的细节
在一个服务器上启用了多个tomcat实例,那么需要特别注意的就是各个实例的端口问题,很容易因为端口冲突造成tomcat实例启动失败!

各个tomcat实例需要修改的端口,其实就是server.xml文件里的三个端口需要修改,如下:
[root@huanqiu-test conf]# pwd
/Data/app/tomcat-7-wls/conf
[root@huanqiu-test conf]# vim server.xml
.......
        <Connector port="8383" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" />
......
        <Server port="8785" shutdown="SHUTDOWN">
......

<Connector port="8789" protocol="AJP/1.3" redirectPort="8443" />

只要上面三个端口不冲突,基本就能成功启动实例了。

另外:最好做下java的环境变量设置,不然,tomcat启动容易失败~~
[root@huanqiu-test ~]# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
[root@huanqiu-test ~]# which java
/usr/bin/java
[root@huanqiu-test ~]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 7月 11 2015 /usr/bin/java -> /etc/alternatives/java
[root@huanqiu-test ~]# ll /etc/alternatives/java
lrwxrwxrwx. 1 root root 46 7月 11 2015 /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

由此可知,java的home目录是/usr/lib/jvm/jre-1.7.0-openjdk.x86_64

[root@huanqiu-test jvm]# ll
总用量 8
drwxr-xr-x. 3 root root 4096 7月 11 2015 java-1.6.0-openjdk-1.6.0.0.x86_64
drwxr-xr-x. 3 root root 4096 7月 11 2015 java-1.7.0-openjdk-1.7.0.45.x86_64
lrwxrwxrwx. 1 root root 21 7月 11 2015 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 27 7月 11 2015 jre-1.6.0 -> /etc/alternatives/jre_1.6.0
lrwxrwxrwx. 1 root root 37 7月 11 2015 jre-1.6.0-openjdk.x86_64 -> java-1.6.0-openjdk-1.6.0.0.x86_64/jre
lrwxrwxrwx. 1 root root 27 7月 11 2015 jre-1.7.0 -> /etc/alternatives/jre_1.7.0
lrwxrwxrwx. 1 root root 38 7月 11 2015 jre-1.7.0-openjdk.x86_64 -> java-1.7.0-openjdk-1.7.0.45.x86_64/jre
lrwxrwxrwx. 1 root root 29 7月 11 2015 jre-openjdk -> /etc/alternatives/jre_openjdk

设置java的环境变量
[root@huanqiu-test jvm]# vim /etc/profile
.......
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

使之生效
[root@huanqiu-test ~]# source /etc/profile

[root@huanqiu-test ~]# echo $JAVA_HOME
/usr/lib/jvm/java-1.7.0-openjdk.x86_64
[root@huanqiu-test ~]# echo $CLASSPATH
.:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/lib/dt.jar:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/lib/tools.jar

上面java的环境变量一定要设置!不然tomcat启动会失败,会有以下报错:
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

[通常:在对tomcat服务进行迁移或切换的时候,需要将webapps下的ROOT和ROOT.war包都一起拷贝过去]

######  Tomcat中实现IP访问限制  ######
Tomcat中的ip访问限制,即设置允许某个(或某些)客户端能够访问到tomcat服务器,或不能访问tomcat服务器。限制tomcat的IP访问其实是一件非常容易的事情,只需要编辑tomcat的server.xml,增加适当代码即可。

修改如下:
例如有一个名为myapp的虚拟目录,打开tomcat的server.xml配置文件,找到其配置代码如下:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp" />
将其改成下面代码:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp">
<valueclassName="org.apache.catalina.values.RemoteAddrValue"
allow="127.0.0.1" deny="″ />
</Context> 经过这样设置后,将只允许本机访问Tomcat. 如要限制只能192.168.1.0-192.168.5.255和192.168.10.0-192.168.15.255这样的IP段,可以类似这样写:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp">
<valueclassName="org.apache.catalina.values.RemoteAddrValue"
allow="192.168.[1-5].*,192.168.[10-15].*" deny="″ />
</Context>
设置好后重新启动Tomcat就生效. 注意:
<Context 内容要放在<Host </Host>之间 ================另一种玩法=================
效果:只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。
Tomcat供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve,前者用于限制主机名,后者用于限制IP地址。通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。 1)全局设置,对Tomcat下所有应用生效
server.xml中添加下面一行,重启服务器即可:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/>
此行放在</Host>之前。 例子:
只允许192.168.1.10访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10" deny=""/> 只允许192.168.1.*网段访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/> 只允许192.168.1.10、192.168.1.30访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10,192.168.1.30" deny=""/> 根据主机名进行限制:
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="abc.com" deny=""/> 2)局部设置,仅对具体的应用生效
根据项目配置情况进行设置:
直接在server.xml中进行设置${tomcat_root}/conf/server.xml 在上述文件对应项目的</Context>前增加下面一行:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/> 特别需求:测试版本不想提供别人访问
打开tomcat6/conf/server.xml文件
如果是要限制整个站点别人不能访问,则要将
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*,192.168.2.*,*.mysite.com" deny=""/>
加入到<HOST></HOST>标签中 如果是要限制某个站点不能被访问,则要加入到<Context>里面就可以。
<Context path="/myweb" reloadable="true" docBase="/data/tomcat6/webapps/myweb">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.13.110,192.168.1.*,220.250.13.21" deny=""/>
</Context> RemoteHostValve表示根据主机名进行限制:
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="tmachine1" deny=""/>
修改文件:
tomcat/conf/server.xml 通过tomcat限制ip访问
<Engine name="Standalone" ...>
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow="*.mycompany.com,*.a.com"/> #域名限制
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192.168.1.*"/> #IP限制
</Engine> 重启tomcat生效

######    Tomcat 大文件上传超时问题处理    #######
公司的OA系统在上传一个70多M的大文件过程中,出现了"上传超过有效期"超时现象。原因是tomcat持续上传附件时间超过了系统默认时间。

需要调整tomcat容器的JVM参数,修改方法如下:在tomcat的bin/catalina.sh文件里添加参数"-DLandray.sys.att.expire=600",此参数是修改附件上传有效期,这里上传有效期为600秒,既持续上传时间为10分钟,超过10分钟附件还未上传成功则会提示超时,可根据实际情况调整这个时常。

[root@oa-app02 bin]# vim /home/app/linux64/tomcat/bin/catalina.sh
.......
JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx3072m -XX:PermSize=256M -XX:MaxPermSize=512M -Xmn256M -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Djava.net.preferIPv4Stack=true -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -DLandray.kmss.cluster.serverName=ekp_server21 -Djava.net.preferIPv4Stack=true -DLandray.sys.att.expire=600"

接着重启tomcat即可
[root@oa-app02 bin]# ps -ef|grep tomcat|grep -v grep |xargs kill -9

[root@oa-app02 bin]#/home/app/linux64/tomcat/bin/startup.sh

================================================================
另外需要注意,tomcat配置文件中关于超时时间的配置如下:
在tomcat的server.xml中加入如下配置

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="300000" disableUploadTimeout="true"
            minProcessors="50" maxProcessors="375" acceptCount="500"
            redirectPort="5443" URIEncoding="UTF-8"/>

其中:
connectionTimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒
disableUploadTimeout:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为true
maxProcessors:最大连接线程数
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。

######   Tomcat 禁用trace、put、head、options、delete请求方式    ######

系统项目采用tomcat部署,处于安全考虑,需要禁用trace、put、head、post、delete请求方式,项目中请求方式只有GET,POST请求。

Tomcat 禁用trace、put、head、post、delete请求方式的配置方法如下:

1)在tomcat的web.xml配置文件最后加上请求方式限制,配置如下(这里使用的tomcat8):
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
    <http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint> 这里主要目的是限制服务器只接受GET,POST请求,不做其他权限限制,以上配置即可满足。 2)经过测试,发现除了TRACE请求,其他请求方式都顺利拦截。
TRACE请求返回的是405 method not allowed,也就是说TRACE没有被拦截!这是为什么呢?? 最后发现Connector 中有个allowTrace属性,这里默认禁用了trace请求,将allowTrace设置为true就可以限制TRACE请求了。
至于为什么,可能是Connector的优先级高于security-constraint的配置。 解决办法:在server.conf文件中修改如下配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" allowTrace="true"/>

######   Tomcat解析url报错400问题    ###### (Tomcat请求参数限制的问题)
升级Tomcat8之后,发现访问的所有http请求都失败,返回状态码400,提示"invalid character found in the request target"。

产生原因:
由于Tomcat新版本增加一个特性: 严格按照RFT 3986规范定义了URL。因为Tomcat严格按照"RFC 3986"规范进行访问解析,而"RFC 3986"规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)-  _  .  ~ 这4个特殊字符以及所有保留字符。RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]

Tomcat在很多版本后添加了对于http头的验证。当传入的参数中有不在RFC3986中的保留字段中,所以会报400这个错误。

解决办法有下面几种:
1)降低tomcat的版本,这是最简单也是解决问题最快的方法。
2)Tocmat可以定义requestTargetAllow 属性来允许禁止的字符。在tomcat的 catalina.properties文件中添加这一句(该方案能解决部分支持|{},对其他特殊字符没法支持):

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

3)如果第2种方法配置后不生效(这种配置有点过时),可以尝试在tomcat的server.xml文件中添加下面relaxedPathChars和relaxedQueryChars两个配置:

   <Connector port="8084" protocol="HTTP/1.1"
relaxedPathChars="[]|"
relaxedQueryChars="[]|{}^\`"<>"
useBodyEncodingForURI="true"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>

######    Nginx反向代理Tomcat访问报错400问题    #######
线上用nginx反向代理tomcat访问,配置完成后,直接访问tomcat完全正常,但是只要在nginx添加反向代理tomcat,访问nginx就会报错400。

原因和解决办法:
1)后端服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果nginx代理层不重写请求头中的host字段,将会导致请求失败,报400错误。解决办法:

proxy_set_header Host $http_host;

2)nginx配置中header头部信息的host不能被配置重了。tomcat没有对headers中的host进行唯一校验。
解决办法(下面两个要去掉一个):

   proxy_set_header Host $host;
proxy_set_header Host $http_host; #去掉这一行

######   Tomcat的server.xml文件中的Connector常用配置    #######
Tomcat中server.xml有些配置信息是需要清楚了解的,尤其是要熟悉Connector配置信息,方便在日常运维中进行调试。默认情况下Connector配置信息基本上就可以用了,如下:

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

下面简单的介绍Connector标签上还能挂载的其他配置项:
1.  port
tomcat作为一个网络server端,它需要暴露一个socket端口来accept客户端的链接,可以通过port指定。

2.  protocol
使用的网络协议,表示tomcat使用何种方式来接受和处理client端请求,"HTTP/1.1"是默认值,等效于"org.apache.coyote.http11.Http11Protocol"。

3.  connectionTimeout
当client与tomcat建立连接之后,在"connectionTimeout"时间之内,仍然没有得到client的请求数据,此时连接将会被断开。此值的设定需要考虑到网络稳定型,同时也有性能的考虑。它和tcp的配置选项中的"socket_timeout"仍有区别,connectionTimeout只会在链接建立之后,得到client发送http-request信息前有效。默认值为60000,即60秒;对于互联网应用,此值应该设置合理,比如20000。

4.  maxHeaderCount
http请求中header的最大个数,默认为100,"-1"表示不限制,通常不会关注此属性,不过在一些设计"扭曲"的web应用中,使用header传递大量参数(:post)和校验信息时,可能需要调整此值。如果请求中的header个数超过此限定值,请求将会被拒绝。(避免恶性攻击,建议此值设置为符合application的实际需要)

5.  maxParameterCount
http-get请求中允许传递的查询字符串的最大个数,尽管各种http浏览器 (proxy工具) 都会对http-get请求的长度和查询字符串的个数有限制,你仍然可以通过tomcat再次设定合适的值。parameter个数越多,事实上对tomcat的内存开支更大,很多时候处于安全或者实用的角度考虑,maxParameterCount的值都不会太大。默认值为10000,"-1"表示无限制。如果请求中参数的个数超过限定值,请求将会被拒绝。(为了避免恶性攻击,请根据application实际需要设定此值)为了安全和规范,maxHeaderCount和maxParamterCount通常应该合理,建议设置为100等;如果请求参数再多,那么就建议使用post body发送或者拆分请求。

6.  maxPostSize
http-post请求中数据 (body) 的最大尺寸,单位:byte,默认值为2M。这对一些表单提交(较多文本域)有影响。可以适度调整此值,大文件上传一般会在client拆分成小文件,而不是直接发送。

7.  URIEncoding
http-get请求中,使用何种字符集对查询字符串进行编码,默认为"iso-8859-1"。

8.  useBodyEncodingForURI
是否使用"Content-type"中指定的编码方式对http-get请求中查询字符串进行编码。如果为"true",将会忽略"URIEncoding"配置项,转而使用header中"content-Type"指定编码方式。

9.  maxThreads
用于接收和处理client端请求的最大线程数,tomcat底层将采取线程池的方式来处理客户端请求,此参数标识这线程池的尺寸。maxThreads意味着tomcat能够并发执行request的个数。此值默认为200。一般情况下,在production环境中(根据物理机器配置,或者虚拟机的限制来做参考值),通常会有微调。较大的值并不能提升tomcat的负载能力,事实上"200"个线程数,已经足够大了。之前线上环境为maxThreads=120。对于NIO模式下,maxThreads参数应该由CPU核心数决定,乐观起见,此值为:cpu核数 * 2。太大的值,并不能提升NIO性能,反而会使性能下降,因为线程切换(CS)将会占据CPU的大量时间。

10.  compression
是否对http相应数据启用Gzip压缩,可选值为"off"或者"on";这是一个值得商榷的参数;如果开启压缩,意味着较少的网络传输量,但是将消耗一定的CPU。如果你的应用有较高的CPU性能结余,且响应数据均是一些文本字符串,那么开启压缩,会有较大的收益。(并不是所有的浏览器都能够合理的支持gzip压缩,特别是低版本)

11.  acceptCount
当tomcat请求处理线程池中的所有线程都处于忙碌状态时,此时新建的链接将会被放入到pending队列,acceptCount即是此队列的容量,如果队列已满,此后所有的建立链接的请求(accept),都将被拒绝。默认为100。在高并发/短链接较多的环境中,可以适当增大此值;当长链接较多的场景中,可以将此值设置为0。这个参数将会在创建ServerSocket时带入,为TCP底层参数。如果请求均为短连接、请求耗时较短,我们可以适当增加此值。

12.  address
当物理server上绑定了多个IP地址时,可以通过“address”来指定tomcat-server需要bind的地址。默认将port关联到所有的ip上。

13.  bufferSize
链接在读取stream时,buffer数据的尺寸。(非socket buffer)

14.  connectionLinger
socket linger参数值。当socket即将关闭时(前)阻塞的时间,单位秒。如果设置为-1表示关闭linger。在BIO和AJP链接中默认为100,NIO中默认为25。

15.  keepAliveTimeout
当无实际数据交互时,链接被保持的时间,单位:毫秒。在未指定此属性时,将使用connectionTimeout作为keepAliveTimeout。通常和"HTTP keepAlive"选项协调工作。对于HTTP请求,server端为了支撑较高的吞吐量,不可能无限制的keepAlive一个链接(在设计要求上,这个和TCP通讯有本质的区别),keepAliveTimeout超时后,将会导致链接关闭。如果此tomcat设计为“长链接”服务,可以适当增加keepAliveTimeout值,否则无需设置此值。不过通常在tomcat上层还有nginx等代理服务器,通常希望链接keepAlive的机制由代理服务器控制,比如nginx来决定链接是否需要"保持活性"(注意:与keep_alive不同),当然nginx服务器只会保留极少的长连接,几乎所有的链接都会在使用结束后主动close;因为链接复用层,将有nginx与client保持,而不再是tomcat与client保持。太多的keepAlive链接,尽管提高了链接使用效率,但是对负载均衡不利。

16.  maxKeepAliveRequests
tomcat需要保持的最大请求数,即处于keepAlive状态的请求的个数,建议此值为maxThreads * 0.5,不得大于maxThreads,否则将得不到预期的效果。-1表示不限制,1表示关闭keepAlive机制。

17.  maxConnections
tomcat允许接收和处理的最大链接数,对于BIO而言此值默认与maxThreads参数一样,对于NIO而言此值默认为10000。对于tomcat已经接受和正在处理的线程数达到此值,server将允许继续accept新链接但是不会处理它们,这些链接将会被阻塞直到连接数降低到此值(server将不会从这些socket中读取数据,而是将它们的句柄buffer起来)。最终server是否可以继续accept新的链接,取决于acceptCount值,因为此值是在创建ServerSocket时传递的参数,超过此值后,链接请求将被拒绝。此值还受限于系统ulimit、CPU、内存等配置。

18.  acceptorThreadCount
默认为1,表示用于accept新链接的线程个数,如果在多核CPU架构下,此值可以设置为2,官方不建议设定超过2个的值。

19.  maxHttpHeaderSize
http头的最大尺寸,默认为8192,单位为“字节”。

20.  minSpareThreads
线程池中,保持活跃的线程的最小数量,默认为10。

21.  SSLEnabled
是否开启ssl支持,默认为false;通常SSL应该在nginx等代理层,我们不应该让tomcat直接接入。

22.  pollerThreadCount
表示用于polling IO事件的线程个数,默认为1。在多核CPU架构下,我们可以设置为2来提高polling的能力,官方不建议设置大于2的值,因为锁的竞争会导致性能下降,事实上一个线程也足够快速。

23.  useSendfile
是否开启sendfile特性,默认为true。对于web应用而言,通常project中还会包含一定数量的静态资源,比如图片、CSS、js、html等,sendfile在一定程度上可以提高性能。

24.  selectorTimeout
选择器阻塞的时间,如果你进行过NIO开发,应该知道此参数的含义,默认值为1000毫秒。此值不要太大,因为selector线程本身还需要用来清理已关闭的链接等。

25.  selectorPool.maxSelectors
NIO中选择的个数,默认值为200。NIO中我们可以使用多个selector,每个selector负责注册一定数量的NIOChannel,这样可以有效的提高selector选择效率;通常我们建议此值与maxThreads值一致,或者小于maxThreads,但是大于maxThreads其实意义并不大。为了开启此特性,我们需要在catalina.sh中增加一个启动命令参数:

CATALINA_OPTS="-Dorg.apache.tomcat.util.net.NioSelectorShared=false"

下面贴一个Connector的常规配置:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
maxHeaderCount="64"
maxParameterCount="64"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
useBodyEncodingForURI="false"
maxThreads="128"
minSpareThreads="12"
acceptCount="1024"
connectionLinger="-1"
keepAliveTimeout="60"
maxKeepAliveRequests="32"
maxConnections="10000"
acceptorThreadCount="1"
pollerThreadCount="2"
selectorTimeout="1000"
useSendfile="true"
selectorPool.maxSelectors="128"
redirectPort="8443" />