引用網址:http://duanfei.iteye.com/blog/1722203

1.分配給Tomcat足夠大的記憶體空間。 

      壓解版本中 

檔位置      :bin\catalina.bat 

      這裡增加了   :

Xml代碼  

  1. set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m  

      以下是這條命令在catalina.bat檔中的位置: 

    rem $Id: catalina.bat 656834 2008-05-15 21:04:04Z markt $ 

    rem ————————————————————————— 

   

Xml代碼  

  1. set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m  
  2.   
  3.     rem Guess CATALINA_HOME if not defined  

      可以在catalina.bat檔最後加上一條命令:echo %JAVA_OPTS%>d:\JAVA_OPTS.log 

      安裝版本中: 

可以執行Apache Tomcat 6 Properties配置管理工具。 

進入Java面板後設置相關的Java參數: 

Java Options:加入 

-XX:PermSize=128M 

-XX:MaxNewSize=256m 

-XX:MaxPermSize=256m 

Initial memory pool        :256               MB 

Maximum memory pool :1024             MB 

Thread stack size          :1024             KB 

2.設置Tomcat連接器相關參數。 

Xml代碼  

  1. <Connector  
  2.   
  3. executor="tomcatThreadPool"  
  4.   
  5. port="8090″  
  6.   
  7. redirectPort="8443″  
  8.   
  9. protocol="org.apache.coyote.http11.Http11NioProtocol"  
  10. 10.   

11. compression="on"  

  1. 12.   

13. compressionMinSize="2048″  

  1. 14.   

15. enableLookups="false"  

  1. 16.   

17. acceptCount="1000″  

  1. 18.   

19. URIEncoding="UTF-8″  

  1. 20.   

21. connectionTimeout="40000″ />  

連接器使用的執行緒池的名子:executor="tomcatThreadPool" 

連接器埠                        :port="8090″ 

連接器使用的傳輸方式      :protocol="org.apache.coyote.http11.Http11NioProtocol" 

傳輸時是否支援壓縮          :compression="on" 

壓縮的大小                        :compressionMinSize="2048″ 

3.設置Tomcat連接器池。 

Xml代碼  

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"   
  2.         maxThreads="800″ minSpareThreads="400″ maxSpareThreads="700″/>  

      執行緒池名:           name="tomcatThreadPool" 

      執行緒首碼:           namePrefix="catalina-exec-" 

      最大產生執行緒數:maxThreads="800″ 

      最小初始現程數:minSpareThreads="400″ 

      最大初始現程數:minSpareThreads="700″ 

4.開啟Tomcat6的Nio機制。 

Xml代碼  

  1. protocol="org.apache.coyote.http11.Http11NioProtocol"  

5.設置Tomcat安全相關。 

      設置:\apache-tomcat-6.0.18\conf\web.xml 

       

Xml代碼  

  1. <init-param>  
  2.   
  3.             <param-name>listings</param-name>  
  4.   
  5.             <param-value>false</param-value>  
  6.   
  7.         </init-param>  

      設置Manager用戶名和密碼 

      檔位置:

Xml代碼  

  1. D:\apache-tomcat-6.0.18\conf\ tomcat-users.xml        
  2.   
  3.       <?xml version=’1.0′ encoding=’utf-8′?>  
  4.   
  5. <tomcat-users>  
  6.   
  7. <role rolename="manager"/>  
  8.   
  9. <user username="temobi" password="temobi8090″ roles="manager"/>  
  10. 10.   

11. </tomcat-users>  

使用ab工具簡單測試Tomcat併發。 

1. JVM 

1.1. 使用 Server JRE 替代JDK。 

伺服器上不要安裝JDK,請使用 Server JRE. 伺服器上根本不需要編譯器,代碼應該在Release伺服器上完成編譯打包工作。 

理由:一旦伺服器被控制,可以防止在其伺服器上編譯其他惡意程式碼並植入到你的程式中。 

1.2. JAVA_OPTS 

Xml代碼  

  1. export JAVA_OPTS="-server -Xms512m -Xmx4096m  -XX:PermSize=64M -XX:MaxPermSize=512m"  

-Xms 指定初始化時化的棧記憶體 

-Xmx 指定最大棧記憶體 

2. Tomcat 優化 

2.1. maxThreads 連接數限制 
maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法。 
即,在一個伺服器上啟動多個tomcat然後做負載均衡處理。 

Java代碼  

  1. <Connector port="8080″ address="localhost"  
  2.     maxThreads="2048″ maxHttpHeaderSize="8192″  
  3.     emptySessionPath="true" protocol="HTTP/1.1″  
  4.     enableLookups="false" redirectPort="8181″ acceptCount="100″  
  5.     connectionTimeout="20000″ disableUploadTimeout="true" />  

提示 

很多做過php運維的朋友在這裡會犯一個大錯誤,php優化伺服器通常怎做法是安裝cpu以及記憶體的情況配置連接數,連接數過萬都很正常,但java不同jvm配置要非常小心,稍有差錯就會崩潰。 

maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮記憶體開銷。 

2.2. 虛擬主機 

不要使用Tomcat的虛擬主機,每個網站一個實例。即,啟動多個tomcat. 

這也是PHP運維在這裡常犯的錯誤,PHP的做法是一個Web下面放置多個虛擬主機,而不是每個主機啟動一個web伺服器。Tomcat 是多執行緒,共用記憶體,任何一個虛擬主機中的應用出現崩潰,會影響到所有應用程式。採用多個實例方式雖然開銷比較大,但保證了應用程式隔離與安全。 

2.3. 壓錯傳輸 

通常所說的gzip壓縮,Tomcat通過在server.xml配置設置壓縮的選項。 

Xml代碼  

  1. <Connector port="8080″ protocol="HTTP/1.1″  
  2.                connectionTimeout="20000″  
  3.                redirectPort="8443″  
  4.                compression="on"  
  5.                compressionMinSize1="2048″  
  6.                noCompressionUserAgents="gozilla, traviata"  
  7.                compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"/>  

提示 

壓縮會增加Tomcat負擔,最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。 

3. Tomcat 安全配置 

3.1. 安裝後初始化配置 

當Tomcat完成安裝後你首先要做的事情如下: 

首次安裝完成後立即刪除webapps下面的所有代碼 

Bat代碼  

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

注釋或刪除 tomcat-users.xml 所有用戶許可權,看上去如下: 

Bat代碼  

  1. # cat conf/tomcat-users.xml  
  2. <?xml version=’1.0′ encoding=’utf-8′?>  
  3. <tomcat-users>  
  4. </tomcat-users>  

隱藏Tomcat版本資訊 

Bat代碼  

  1. vim $CATALINA_HOME/conf/server.xml  
  2.   
  3.     <Connector port="80″ protocol="HTTP/1.1″  
  4.                connectionTimeout="20000″  
  5.                redirectPort="8443″  
  6.                 maxThreads="8192″  
  7.                 minSpareThreads="64″  
  8.                 maxSpareThreads="128″  
  9.                 acceptCount="128″  
  10. 10.                 enableLookups="false"  
  11. 11.                 server="Neo App Srv 1.0″/>  
  12. 12.   
  13. 13.   
  14. 14.   

15. # curl -I http://localhost:8080/  

16. HTTP/1.1 400 Bad Request  

17. Transfer-Encoding: chunked  

18. Date: Thu, 20 Oct 2011 09:51:55 GMT  

19. Connection: close  

20. Server: Neo App Srv 1.0  

伺服器資訊已經被改為 Server: Neo App Srv 1.0 

3.2. 啟動用戶與埠 

不要使用root使用者啟動tomcat,Java程式與C程式不同。nginx,httpd 使用root用戶啟動守護80埠,子進程/執行緒會通過setuid(),setgid()兩個函數切換到普通使用者。即父進程所有者是root使用者,子進程與多執行緒所有者是一個非root用戶,這個用戶沒有shell,無法通過ssh與控制台登陸系統,Java 的JVM 是與系統無關的,是建立在OS之上的,你使用什麼用戶啟動Tomcat,那麽Tomcat 就會繼承該所有者的許可權。 

這造成了一個問題,Linux系統小於1024的埠只有root可以使用,這也是為什麼Tomcat默認埠是8080。如果你想使用80埠只能使用root啟動Tomcat。這有帶來了很多安全問題。 

解決方案是創建一個不同用戶,如: 

Bat代碼  

  1. groupadd -g 80 daemon  
  2. adduser -o –home /daemon –shell /sbin/nologin –uid 80 –gid 80 -c “Web Server" daemon  

注意 /sbin/nologin , 意味著該用戶不能登錄,同時我也沒有給它指定密碼,這個使用者只能用於啟動tomcat 

Bat代碼  

  1. chown daemon:daemon -R /srv/*  
  2. su – daemon -c “/srv/apache-tomcat/bin/startup.sh"  

接下來解決80埠問題, 思路就是80去調用8080,或者映射埠。 

下面是影射方案,80 跳轉 8080 

Bat代碼  

  1. iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080  

取消跳轉 

Bat代碼  

  1. iptables -t nat -D PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080  

查看規則 

Bat代碼  

  1. iptables -t nat -L  

另一個就是從80請求去調用8080的方案 

這個方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array這類設備等等 

3.3. 應用程式安全 

關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程式 

應用程式部署與tomcat啟動,不能使用同一個用戶。 

我的tomcat 安裝在 /srv目錄下,Tomcat啟動使用者為daemon; 應用程式放在/www目錄下www所有者是www用戶。這樣的目的是一旦tomcat被植入web shell程式,它將不能創建或編輯/www目錄下面的任何內容。 

Bat代碼  

  1. adduser –home /www -c “Web Application" www  

3.4. JSESSIONID 

修改 Cookie 變數 JSESSIONID, 這個cookie 是用於維持Session關係。建議你改為PHPSESSID

arrow
arrow
    文章標籤
    tomcat
    全站熱搜
    創作者介紹
    創作者 龍之家族 的頭像
    龍之家族

    龍之家族

    龍之家族 發表在 痞客邦 留言(0) 人氣()