tomcat相關配置技巧梳理 (修改站點目錄、多專案部署、限制ip訪問、大檔案上傳超時等)

散盡浮華發表於2016-11-17

 

tomcat常用架構:
1)nginx+tomcat;即前端放一臺nginx,然後通過nginx反向代理到tomcat埠(可參考:分享一例測試環境下nginx+tomcat的視訊業務部署記錄
2)tomcat直接部署站點,不通過nginx反向代理。

下面針對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:指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,就是被排隊的請求數,超過這個數的請求將拒絕連線。 

相關文章