Tomcat虛擬主機
什麼是虛擬主機?
虛擬主機就是把一臺真正的主機分成許多“虛擬”的主機,每一臺虛擬主機都具有獨立的域名和IP地址,具有完整的Internet服務器功能。
虛擬主機之間完全獨立,在外界看來,每一臺虛擬主機和一臺獨立的主機完全一樣。
配置文件位置:
/conf/server.xml #tomcat配置文件
tomcat的默認端口:8080
1.基於域名的虛擬主機
多個域名解析一個IP地址
[work@localhost tomcat]$ vim conf/server.xml 添加如下內容
<Host name="www.maiya.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase='jspgou' path="" reloadable="true" crossContext="true"/>
</Host>
參數說明:
appBase: 指定站點根目錄位置(可以是相對路徑或絕對路徑)
unpackWAR :本項爲"true" 意味着 Tomcat 會保存 .war 包的解壓結果,然後直接對解壓結果進行運行。
考慮到jvm的類加載機制,每個類都僅加載一次,但是頁面內容卻沒有類似的有效緩存,所以 .war 還是解壓執行的比較好。
path: 指定訪問路徑URI(虛擬目錄名)
docBase :指定jsp項目的存放路徑(可以是相對路徑或絕對路徑)
debug :設定debug的等級0提供最少的信息,9提供最多的信息
reloadable :本項爲true時 當web.xml或者class有改動的時候都會自動重新加載不需要從新啓動服務(所謂的支持熱發佈功能)
crosscontext :本項爲"true" 表示配置的不同context共享一個session
cachingAllowed :本項爲"true"時 意味着開啓了 Tomcat 的靜態緩存功能。靜態文件包括 JavaScript 程序、圖片聲音等允許網絡訪問的文件以及 HTML 頁面。
cacheMaxSize :指定靜態緩存功能緩衝區大小的設定。單位是 MB ,也就是 1024KB 。例子中設爲 1024 ,意味着1GB 。
2.基於端口虛擬主機
一個IP地址,通過不同的端口實現不同網站的訪問
關鍵 : 在server.xml 中 設置兩個service組件,設置不同的端口(基於端口應用範圍很少)
<Service name="Catalinai1">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.maiya.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase='jspgou' path="" reloadable="true" crossContext="true"/>
</Host>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.maiya.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase='jspgou' path="" reloadable="true" crossContext="true"/>
</Host>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
Tomcat Manager 管理頁面
添加允許訪問的主機
[work@localhost tomcat]$ vim webapps/manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10.18.*$" /> <Manager
sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFil
ter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> </Context>
添加允許訪問的用戶和角色
[work@localhost tomcat]$ vim conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123" roles="admin-gui,manager-gui,manager-script"/>
Tomcat調優
JVM內存優化
vim bin/catalina.sh
CATALINA_OPTS="-server -Xms128m -Xmx512m"
# 或者
JAVA_OPTS="$JAVA_OPTS -Xms4096m -Xmx4096m -XX:PermSize=1024m -XX:MaxPermSize=2048m"
開啓GC日誌
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log"
開啓JMX端口便於監控
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10028
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=java69-matrix.zeus.lianjia.com"
取消JVM 的默認DNS緩存時間
不緩存DNS記錄,避免DNS解析更改後要重啓JVM虛擬機
CATALINA_OPTS="$CATALINA_OPTS -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0
參數說明:
-server:表示這是應用於服務器的配置,JVM 內部會有特殊處理的
-Xmx1024m:設置JVM最大堆可用內存爲1024MB
-Xms1024m:設置JVM最小內堆存爲1024m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
-XX:NewSize:設置年輕代大小
-XX:MaxNewSize:設置最大的年輕代大小
-XX:PermSize:設置永久代大小
-XX:MaxPermSize:設置最大永久代大小
-XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與終身代的比值(除去永久代)。設置爲 4,則年輕代與終身代所佔比值爲 1:4,年輕代佔整個堆棧的 1/5
-XX:MaxTenuringThreshold=10:設置垃圾最大年齡,默認爲:15。如果設置爲 0 的話,則年輕代對象不經過Survivor 區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置爲一個較大值,則年輕代對象會在 Survivor 區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
-XX:+DisableExplicitGC:這個將會忽略手動調用 GC 的代碼使得 System.gc() 的調用就會變成一個空調用,完全不
會觸發任何 GC
Tomcat併發優化
Tomcat配置文件conf/server.xml中
minProcessors: 最小空閒連接線程數,用於提高系統處理性能,默認值爲 10
maxProcessors: 最大連接線程數,即:併發處理的最大請求數,默認值爲 75
acceptCount: 允許的最大連接數,應大於等於 maxProcessors ,默認值爲 100
enableLookups: 是否反查域名,取值爲: true 或 false 。爲了提高處理能力,應設置爲 false
connectionTimeout: 網絡連接超時,單位:毫秒。設置爲 0表示永不超時,這樣設置有隱患的。通常可設置爲30000毫秒。
其中和最大連接數相關的參數爲maxProcessors 和 acceptCount 。如果要加大併發連接數,應同時加大這兩個參數。
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是 2000個左右, Linux是1000個左右。
maxThreads: 客戶請求最大線程數
minSpareThreads: Tomcat初始化時創建的 socket 線程數
maxSpareThreads: Tomcat連接器的最大空閒 socket 線程數
enableLookups: 若設爲true, 則支持域名解析,可把 ip 地址解析爲主機名
redirectPort: 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
acceptAccount: 監聽端口隊列最大數,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads)
connectionTimeout: 連接超時
minProcessors: 服務器創建時的最小處理線程數
maxProcessors: 服務器同時最大處理線程數
URIEncoding: URL統一編碼
Tomcat Connector運行模式優化
Tomcat Connector有三種運行模式:
bio:阻塞IO bio是三種運行模式中性能最低第一種。
nio:是一個基於緩衝區,並能提供非阻塞I/O操作的JAVA API 因此NIO也成爲非阻塞I/O,比bio擁有更好的併發性能。
apr:調用httpd核心鏈接庫來讀取或文件傳輸,從而提高tomat對靜態文件的處理性能。Tomcat APR模式也是Tomcat在高併發下的首選運行模式