Home | Mirror | Search | ITEYE 博客 | OSChina 博客 | 51CTO 博客 |
版權 © 2011, 2012, 2013 http://netkiller.github.io
$Date: 2013-07-23 11:48:13 +0800 (Tue, 23 Jul 2013) $
摘要
我的系列文檔
目錄
伺服器上不要安裝JDK,請使用 Server JRE. 伺服器上根本不需要編譯器,代碼應該在Release伺服器上完成編譯打包工作。
理由:一旦伺服器被控制,可以防止在其伺服器上編譯其他惡意代碼並植入到你的程序中。
maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法。
即,在一個伺服器上啟動多個tomcat然後做負載均衡處理。
<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 參數調整,也就是要考慮內存開銷。
不要使用Tomcat的虛擬主機,每個站點一個實例。即,啟動多個tomcat.
這也是PHP運維在這裡常犯的錯誤,PHP的做法是一個Web下面放置多個虛擬主機,而不是每個主機啟動一個web伺服器。Tomcat 是多綫程,共享內存,任何一個虛擬主機中的應用出現崩潰,會影響到所有應用程序。採用多個實例方式雖然開銷比較大,但保證了應用程序隔離與安全。
通常所說的gzip壓縮,Tomcat通過在server.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 去做。
當Tomcat完成安裝後你首先要做的事情如下:
首次安裝完成後立即刪除webapps下面的所有代碼
rm -rf /srv/apache-tomcat/webapps/*
註釋或刪除 tomcat-users.xml 所有用戶權限,看上去如下:
# cat conf/tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users> </tomcat-users>
隱藏Tomcat版本信息
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" enableLookups="false" server="Neo App Srv 1.0"/> # curl -I http://localhost:8080/ HTTP/1.1 400 Bad Request Transfer-Encoding: chunked Date: Thu, 20 Oct 2011 09:51:55 GMT Connection: close Server: Neo App Srv 1.0
伺服器信息已經被改為 Server: Neo App Srv 1.0
不要使用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。這有帶來了很多安全問題。
解決方案是創建一個不同用戶,如:
groupadd -g 80 daemon adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
注意 /sbin/nologin , 意味着該用戶不能登錄,同時我也沒有給它指定密碼,這個用戶只能用於啟動tomcat
chown daemon:daemon -R /srv/* su - daemon -c "/srv/apache-tomcat/bin/startup.sh"
接下來解決80連接埠問題, 思路就是80去調用8080,或者映射連接埠。
下面是影射方案,80 跳轉 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 取消跳轉 iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 查看規則 iptables -t nat -L
另一個就是從80請求去調用8080的方案
這個方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array這類設備等等
關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程序
應用程序部署與tomcat啟動,不能使用同一個用戶。
我的tomcat 安裝在 /srv目錄下,Tomcat啟動用戶為daemon; 應用程序放在/www目錄下www所有者是www用戶。這樣的目的是一旦tomcat被植入web shell程序,它將不能創建或編輯/www目錄下面的任何內容。
adduser --home /www -c "Web Application" www