經常使用的服務器上Tomcat配置

1. JVM

1.1. 使用 Server JRE 替代JDK。

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

理由:一旦服務器被控制,能夠防止在其服務器上編譯其餘惡意代碼並植入到你的程序中。php

1.2. JAVA_OPTS

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

-Xms 指定初始化時化的棧內存css

-Xmx 指定最大棧內存html

2. Tomcat 優化

2.1. maxThreads 鏈接數限制

maxThreads 是 Tomcat 所能接受最大鏈接數。通常設置不要超過8000以上,若是你的網站訪問量很是大可能使用運行多個Tomcat實例的方法。java

即,在一個服務器上啓動多個tomcat而後作負載均衡處理。nginx

<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配置要很是當心,稍有差錯就會崩潰。web

maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮內存開銷。shell

2.2. 虛擬主機

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

這也是PHP運維在這裏常犯的錯誤,PHP的作法是一個Web下面放置多個虛擬主機,而不是每一個主機啓動一個web服務器。Tomcat 是多線程,共享內存,任何一個虛擬主機中的應用出現崩潰,會影響到全部應用程序。採用多個實例方式雖然開銷比較大,但保證了應用程序隔離與安全。vim

2.3. 壓錯傳輸

一般所說的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 去作。

3. Tomcat 安全配置

3.1. 安裝後初始化配置

當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

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。這有帶來了不少安全問題。

解決方案是建立一個不一樣用戶,如:

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這類設備等等

3.3. 應用程序安全

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

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

個人tomcat 安裝在 /srv目錄下,Tomcat啓動用戶爲daemon; 應用程序放在/www目錄下www全部者是www用戶。這樣的目的是一旦tomcat被植入web shell程序,它將不能建立或編輯/www目錄下面的任何內容。

adduser --home /www -c "Web Application" www

3.4. JSESSIONID

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

相關文章
相關標籤/搜索