1. JVM
1.1.?使用 Server JRE 替代JDK。
服務(wù)器上不要安裝JDK笆焰,請(qǐng)使用 Server JRE. 服務(wù)器上根本不需要編譯器,代碼應(yīng)該在Release服務(wù)器上完成編譯打包工作见坑。
理由:一旦服務(wù)器被控制嚷掠,可以防止在其服務(wù)器上編譯其他惡意代碼并植入到你的程序中。
1.2.?JAVA_OPTS
export JAVA_OPTS="-server -Xms512m -Xmx4096m? -XX:PermSize=64M -XX:MaxPermSize=512m"
-Xms 指定初始化時(shí)化的棧內(nèi)存
-Xmx 指定最大棧內(nèi)存
提示
Java 8 以后 -XX:PermSize 與 -XX:MaxPermSize 兩個(gè)配置項(xiàng)被廢棄
2.?Tomcat 優(yōu)化
2.1.?maxThreads 連接數(shù)限制
maxThreads 是 Tomcat 所能接受最大連接數(shù)荞驴。一般設(shè)置不要超過8000以上不皆,如果你的網(wǎng)站訪問量非常大可能使用運(yùn)行多個(gè)Tomcat實(shí)例的方法。
即熊楼,在一個(gè)服務(wù)器上啟動(dòng)多個(gè)tomcat然后做負(fù)載均衡處理霹娄。
maxThreads="2048" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8181" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
提示
很多做過php運(yùn)維的朋友在這里會(huì)犯一個(gè)大錯(cuò)誤,php優(yōu)化服務(wù)器通常怎做法是安裝cpu以及內(nèi)存的情況配置連接數(shù)鲫骗,連接數(shù)過萬都很正常犬耻,但java不同jvm配置要非常小心,稍有差錯(cuò)就會(huì)崩潰执泰。
maxThreads 配置要結(jié)合 JVM -Xmx 參數(shù)調(diào)整枕磁,也就是要考慮內(nèi)存開銷。
maxThreads? 客戶請(qǐng)求最大線程數(shù)
minSpareThreads? ? 初始化時(shí)創(chuàng)建的 socket 線程數(shù)
maxSpareThreads? 連接器的最大空閑 socket 線程數(shù)
2.2.?虛擬主機(jī)
不要使用Tomcat的虛擬主機(jī)术吝,每個(gè)站點(diǎn)一個(gè)實(shí)例计济。即茸苇,啟動(dòng)多個(gè)tomcat.
這也是PHP運(yùn)維在這里常犯的錯(cuò)誤,PHP的做法是一個(gè)Web下面放置多個(gè)虛擬主機(jī)沦寂,而不是每個(gè)主機(jī)啟動(dòng)一個(gè)web服務(wù)器学密。Tomcat 是多線程,共享內(nèi)存,任何一個(gè)虛擬主機(jī)中的應(yīng)用出現(xiàn)崩潰凑队,會(huì)影響到所有應(yīng)用程序则果。采用多個(gè)實(shí)例方式雖然開銷比較大,但保證了應(yīng)用程序隔離與安全漩氨。
2.3.?壓錯(cuò)傳輸
通常所說的gzip壓縮,Tomcat通過在server.xml配置設(shè)置壓縮的選項(xiàng)遗增。
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"/>
提示
壓縮會(huì)增加Tomcat負(fù)擔(dān)叫惊,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做做修。
compression 打開壓縮功能
compressionMinSize? 啟用壓縮的輸出內(nèi)容大小霍狰,這里面默認(rèn)為2KB
compressableMimeType 壓縮類型
3.?Tomcat 安全配置
3.1.?禁用8005端口
telnet localhost 8005 然后輸入 SHUTDOWN 就可以關(guān)閉 Tomcat,為了安全我們要禁用該功能
3.2.?安裝后初始化配置
當(dāng)Tomcat完成安裝后你首先要做的事情如下:
首次安裝完成后立即刪除webapps下面的所有代碼
rm -rf /srv/apache-tomcat/webapps/*
注釋或刪除 tomcat-users.xml 所有用戶權(quán)限饰及,看上去如下:
# cat conf/tomcat-users.xml
3.2.1.?隱藏版本信息
隱藏Tomcat版本信息蔗坯,首先隱藏HTTP頭中的版本信息
vim $CATALINA_HOME/conf/server.xml
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
服務(wù)器信息已經(jīng)被改為 Server: Neo App Srv 1.0
注意:當(dāng)出現(xiàn) 404 頁面時(shí)仍可能看到Tomcat的版本信息
HTTP Status 404 - /sdf
type Status report
message /sdf
description The requested resource is not available.
Apache Tomcat/8.0.32
隱藏Tomcat 404頁面版本信息的方法如下
mkdir -p apache-tomcat-8.0.33/lib/org/apache/catalina/util
cat >> apache-tomcat-8.0.33/lib/org/apache/catalina/util/ServerInfo.properties <
server.info=Apache
server.number=
server.built=
EOF
測(cè)試
HTTP Status 404 - /sdf
type Status report
message /sdf
description The requested resource is not available.
Apache
3.2.2.?應(yīng)用程序安全
關(guān)閉war自動(dòng)部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程序
關(guān)閉 reloadable="false" 也用于防止被植入木馬
3.2.3.?JSESSIONID
修改 Cookie 變量 JSESSIONID燎含, 這個(gè)cookie 是用于維持Session關(guān)系宾濒。建議你改為PHPSESSID。
3.3.?啟動(dòng)用戶與端口
不要使用root用戶啟動(dòng)tomcat屏箍,Java程序與C程序不同绘梦。nginx,httpd 使用root用戶啟動(dòng)守護(hù)80端口,子進(jìn)程/線程會(huì)通過setuid(),setgid()兩個(gè)函數(shù)切換到普通用戶赴魁。即父進(jìn)程所有者是root用戶卸奉,子進(jìn)程與多線程所有者是一個(gè)非root用戶,這個(gè)用戶沒有shell颖御,無法通過ssh與控制臺(tái)登陸系統(tǒng)榄棵,Java 的JVM 是與系統(tǒng)無關(guān)的,是建立在OS之上的潘拱,你使用什么用戶啟動(dòng)Tomcat疹鳄,那麼Tomcat 就會(huì)繼承該所有者的權(quán)限。
這造成了一個(gè)問題泽铛,Linux系統(tǒng)小于1024的端口只有root可以使用尚辑,這也是為什么Tomcat默認(rèn)端口是8080。如果你想使用80端口只能使用root啟動(dòng)Tomcat盔腔。這有帶來了很多安全問題杠茬。
解決方案是創(chuàng)建一個(gè)普通用戶月褥,如:
groupadd -g 80 daemon
adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
注意 /sbin/nologin , 意味著該用戶不能登錄,同時(shí)我也沒有給它指定密碼瓢喉,這個(gè)用戶只能用于啟動(dòng)tomcat宁赤,沒有Shell權(quán)限就以為只被注入后無法運(yùn)行l(wèi)inux命令。
chown daemon:daemon -R /srv/*
su - daemon -c "/srv/apache-tomcat/bin/startup.sh"
接下來解決80端口問題, 思路就是80去調(diào)用8080栓票,或者映射端口决左。
下面是影射方案,80 跳轉(zhuǎn) 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
取消跳轉(zhuǎn)
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
查看規(guī)則
iptables -t nat -L
另一個(gè)就是從80請(qǐng)求去調(diào)用8080的方案
這個(gè)方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5走贪, Array這類設(shè)備等等