Tomcat日常維護筆記 - 運維小結


 

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" />  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM