引用網址:http://duanfei.iteye.com/blog/1722203
1.分配給Tomcat足夠大的記憶體空間。
壓解版本中
檔位置 :bin\catalina.bat
這裡增加了 :
Xml代碼
- 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代碼
- set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
- 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代碼
- <Connector
- executor="tomcatThreadPool"
- port="8090″
- redirectPort="8443″
- protocol="org.apache.coyote.http11.Http11NioProtocol"
- 10.
11. compression="on"
- 12.
13. compressionMinSize="2048″
- 14.
15. enableLookups="false"
- 16.
17. acceptCount="1000″
- 18.
19. URIEncoding="UTF-8″
- 20.
21. connectionTimeout="40000″ />
連接器使用的執行緒池的名子:executor="tomcatThreadPool"
連接器埠 :port="8090″
連接器使用的傳輸方式 :protocol="org.apache.coyote.http11.Http11NioProtocol"
傳輸時是否支援壓縮 :compression="on"
壓縮的大小 :compressionMinSize="2048″
3.設置Tomcat連接器池。
Xml代碼
- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
- maxThreads="800″ minSpareThreads="400″ maxSpareThreads="700″/>
執行緒池名: name="tomcatThreadPool"
執行緒首碼: namePrefix="catalina-exec-"
最大產生執行緒數:maxThreads="800″
最小初始現程數:minSpareThreads="400″
最大初始現程數:minSpareThreads="700″
4.開啟Tomcat6的Nio機制。
Xml代碼
- protocol="org.apache.coyote.http11.Http11NioProtocol"
5.設置Tomcat安全相關。
設置:\apache-tomcat-6.0.18\conf\web.xml
Xml代碼
- <init-param>
- <param-name>listings</param-name>
- <param-value>false</param-value>
- </init-param>
設置Manager用戶名和密碼
檔位置:
Xml代碼
- D:\apache-tomcat-6.0.18\conf\ tomcat-users.xml
- <?xml version=’1.0′ encoding=’utf-8′?>
- <tomcat-users>
- <role rolename="manager"/>
- <user username="temobi" password="temobi8090″ roles="manager"/>
- 10.
11. </tomcat-users>
使用ab工具簡單測試Tomcat併發。
1. JVM
1.1. 使用 Server JRE 替代JDK。
伺服器上不要安裝JDK,請使用 Server JRE. 伺服器上根本不需要編譯器,代碼應該在Release伺服器上完成編譯打包工作。
理由:一旦伺服器被控制,可以防止在其伺服器上編譯其他惡意程式碼並植入到你的程式中。
1.2. JAVA_OPTS
Xml代碼
- 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代碼
- <Connector port="8080″ address="localhost"
- maxThreads="2048″ maxHttpHeaderSize="8192″
- emptySessionPath="true" protocol="HTTP/1.1″
- enableLookups="false" redirectPort="8181″ acceptCount="100″
- 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代碼
- <Connector port="8080″ protocol="HTTP/1.1″
- connectionTimeout="20000″
- redirectPort="8443″
- compression="on"
- compressionMinSize1="2048″
- noCompressionUserAgents="gozilla, traviata"
- 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代碼
- rm -rf /srv/apache-tomcat/webapps/*
注釋或刪除 tomcat-users.xml 所有用戶許可權,看上去如下:
Bat代碼
- # cat conf/tomcat-users.xml
- <?xml version=’1.0′ encoding=’utf-8′?>
- <tomcat-users>
- </tomcat-users>
隱藏Tomcat版本資訊
Bat代碼
- vim $CATALINA_HOME/conf/server.xml
- <Connector port="80″ protocol="HTTP/1.1″
- connectionTimeout="20000″
- redirectPort="8443″
- maxThreads="8192″
- minSpareThreads="64″
- maxSpareThreads="128″
- acceptCount="128″
- 10. enableLookups="false"
- 11. server="Neo App Srv 1.0″/>
- 12.
- 13.
- 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代碼
- groupadd -g 80 daemon
- adduser -o –home /daemon –shell /sbin/nologin –uid 80 –gid 80 -c “Web Server" daemon
注意 /sbin/nologin , 意味著該用戶不能登錄,同時我也沒有給它指定密碼,這個使用者只能用於啟動tomcat
Bat代碼
- chown daemon:daemon -R /srv/*
- su – daemon -c “/srv/apache-tomcat/bin/startup.sh"
接下來解決80埠問題, 思路就是80去調用8080,或者映射埠。
下面是影射方案,80 跳轉 8080
Bat代碼
- iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080
取消跳轉
Bat代碼
- iptables -t nat -D PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080
查看規則
Bat代碼
- 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代碼
- adduser –home /www -c “Web Application" www
3.4. JSESSIONID
修改 Cookie 變數 JSESSIONID, 這個cookie 是用於維持Session關係。建議你改為PHPSESSID
留言列表