博文大綱:
1、Tomcat概述
2、Tomcat組件及其特色
3、安裝Tomcat
4、Tomcat中server.xml 文件結構
5、多實例(一臺主機運行多個Tomcat)
6、自定義目錄
7、使用Tomcat實時監控JVM虛擬機資源使用狀況
8、開啓JMX遠程調試功能
9、配置使用https訪問tomcat服務器
10、開啓Manager管理頁面
11、開啓host-mangent管理頁面
12、分割Tomcat的運行日誌
十3、定義Tomcat 404錯誤返回的頁面
十4、Tomcat服務的內存優化
十5、Tomcat線程池的優化
十6、更改Tomcat服務的請求方式前端
Tomcat是apache軟件基金會項目中的一個核心項目,是一個免費的開放源代碼的web應用服務器,屬於輕量級的應用服務器,在中小型企業和訪問並非很高的場景很受歡迎,廣泛被使用,並且在開發和調試JSP程序的首選!java
能夠這樣認爲,當一臺服務器部署好Apache服務器後,能夠利用Apache服務器響應客戶端的靜態頁面訪問請求,而Tomcat是Apache服務器的擴展,當運行Tomcat的時候其實是做爲一個Apache獨立的進程單獨運行的,Apache服務器爲靜態頁面提供服務,而Tomcat是解析JSP頁面和servlet,而且Tomcat也具有靜態頁面的解析能力,可是跟Apache相比仍是有些區別的。node
關於Tomcat的內容可不是一兩句話就能夠說完的,建議訪問Tomcat官網詳細瞭解!linux
Servlet(Server Applet):是Java Servlet的簡稱,稱爲小服務程序或服務鏈接器,用Java編寫的服務器端程序,具備獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口;廣義的Servlet是指任何實現了這個Servlet接口的類;通常狀況下,人們將Servlet理解爲後者。
Servlet運行於支持Java的應用服務器中。從原理上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。web
Tomcat處理請求和響應的過程都是由servlet程序來完成的,而且servlet是爲解決實現動態頁面衍生的內容,與Nginx和Apache想要實現動態頁面須要和PHP服務器溝通的過程同樣,就能夠把servlet看作LAMP或LNMP中的PHP。如圖:
算法
Tomcat是web應用服務器,是一個servlet/jsp容器,Tomcat做爲servlet容器,負責處理客戶端請求,並將servlet的響應傳送給客戶,而servlet是一種運行在Java語言的服務器上的組件,servlet最多見的用途是擴展Java web服務器功能,提供很是安全的易於使用cgi替代品。apache
Servlet工做流程:編程
servlet程序是Web服務器調用的,當Web服務器收到客戶端的Servlet訪問請求後,將執行如下幾個過程:
①Web服務器首先檢查是否已經裝載並建立了該Servlet的實例對象。若是是,則直接執行第④步;不然,將執行第②步;
②裝載並建立該servlet的一個實例對象;
③調用Servlet實例;
④建立一個用於封裝HTTP請求的HttpServletRequest對象和一個表明HTTP響應消息的HttpServletResponse對象,而後調用Servlet的service()方法並將請求和響應對象做爲參數傳遞進去;
⑤WEB應用程序被中止或從新啓動以前,Servlet引擎將卸載Servlet,並在卸載以前調用Servlet的destroy()方法;vim
如圖:
後端
①客戶端經過瀏覽器發送請求數據;
②Tomcat收到客戶端的請求數據,由servlet容器處理並進行解析,而且把客戶端的數據請求request改成servlet request交給後端的servlet實例;
③servlet實例收到客戶端的請求數據的請求對象,進行處理客戶端的請求,處理完成後將數據響應給servlet容器,響應給servlet容器叫作servlet response;
④servlet容器將收到的響應數據交給客戶端;
Servlet容器與Servlet實例進行通訊時須要使用Java servlet api接口,而這個接口是由開發人員在寫代碼的時候定義或編寫的。
jsp做爲Servlet技術的擴展,常常會有人將二者搞混,下面簡單介紹一下:
Servlet與JSP的區別:
Servlet在Java代碼中能夠經過HttpServletResponse對象動態輸出HTML內容;
JSP在靜態HTML內容中嵌入Java代碼,而後Java代碼在被動態執行後生成HTML頁面;
Servlet與JSP各自的特色:
Servlet雖然能很好地組織業務邏輯代碼,但在Java源文件中,由於是經過字符串拼接的方式生成HTML內容,這樣就很容易致使代碼維護困難、可讀性較差;
JSP雖然避開了Servlet在生成HTML內容方面的劣勢,可是在HTML中混入大量、複雜得業務邏輯;
運行時佔用的資源小,擴展性強,支持負載均衡和郵件服務器等開發應用系統經常使用的功能。
安裝Tomcat須要系統Java環境1.8版本以上,Centos 7默認就已經支持Java環境1.8版本,因爲如今大部分使用仍是Centos 6的系統,,因爲本人採用的Centos 7系統,因此首先須要卸載JDK環境。
[root@localhost ~]# rpm -qa | grep jdk //查詢本機默認JDK環境 java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64 copy-jdk-configs-3.3-2.el7.noarch java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64 java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64 java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 [root@localhost ~]# rpm -e java-1.8.0-openjdk-headless --nodeps [root@localhost ~]# rpm -e java-1.7.0-openjdk-headless --nodeps //將本來的jdk-headless包卸載 [root@localhost ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local //將提供的JDK軟件包進行解壓 [root@localhost ~]# vim /etc/profile //編寫系統環境變量,在末尾添加如下內容 export JAVA_HOME=/usr/local/jdk1.8.0_211 //指定Java安裝路徑 export JRE_HOME=/usr/local/jdk1.8.0_211/jre //Java運行環境 export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar //聲明Java中的類,類就是一類事務的屬性 export PATH=$JAVA_HOME/bin/:$JRE_HOME/bin/:$PATH //將定義的變量添加到系統環境變量中 [root@localhost ~]# source /etc/profile //從新加載系統環境變量文件 [root@localhost ~]# java -version //查詢支持的Java版本信息 java version "1.8.0_211" //符合要求 Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) [root@localhost ~]# tar zxf apache-tomcat-8.5.35.tar.gz [root@localhost ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat //將tomcat軟件包解壓,並移動到相應的位置 [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //啓動Tomcat服務 [root@localhost ~]# netstat -anpt | grep 8080 //能夠看出Tomcat的訪問端口是8080 tcp6 0 0 :::8080 :::* LISTEN 2186/java 也可使用另外一種方法,編寫好的控制tomcat的腳本在網盤連接中。 [root@localhost ~]# mv tomcat /etc/init.d/ [root@localhost ~]# chmod +x /etc/init.d/tomcat [root@localhost ~]# /etc/init.d/tomcat start //這樣也是能夠的
客戶端訪問測試:
Tomcat服務安裝目錄中的目錄介紹:
經常使用的配置文件:
如圖:
Server:表明整個容器,實例的頂層元素,一個配置文件中只能有一個server元素,能夠包含多個service。好比:
<Server port="8005" shutdown="SHUTDOWN"> //表示關閉Tomcat,使用telnet鏈接8005,輸入shutdown指令
Service:提供完整jvm的獨立組件,jvm表示Java虛擬機,是一個虛構出來的虛擬機,能夠包含一個engine包含多個connector;
<Service name="Catalina"> //表明接受全部tomcat接受的請求,若是是Service name="apache"則表示接受全部apache轉發過來的請求
Connector:接口定義,負責接受客戶端的請求,以及向客戶端返回響應的結構;
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> //port:接受數據的端口;protocol:設置http協議; //Connection Timeout:與客戶端的鏈接超時時間,-1表明不限制客戶端的鏈接時間; //Redirectport :當客戶端請求是https將請求轉發到8443去
Engine:處理客戶端的請求,能夠包含多個hots;
<Engine name="Catalina" defaultHost="localhost"> //name:是引擎名稱,處理客戶的請求默認去尋找localhost
Host:定義的虛擬主機,爲特定的虛擬主機處理全部的客戶端請求;
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
Context:運行在虛擬主機中的單個web應用;
Tomcat處理http請求過程,如圖:
具體過程:
①用戶點擊網頁內容,請求被髮送到本機端口8080,被在那裏監聽的Coyote HTTP/1.1 Connector得到;
②Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的迴應;
③Engine得到請求localhost/test/index.jsp,匹配全部的虛擬主機Host;
④Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機),名爲localhost的Host得到請求/test/index.jsp,匹配它所擁有的全部的Context。Host匹配到路徑爲/test的Context(若是匹配不到就把該請求交給路徑名爲「 」的Context去處理);
⑥path=「/test」的Context得到請求/index.jsp,在它的mapping table中尋找出對應的Servlet。Context匹配到URL PATTERN爲*.jsp的Servlet,對應於JspServlet類;
⑥構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet()或doPost().執行業務邏輯、數據存儲等程序;
⑦Context把執行完以後的HttpServletResponse對象返回給Host;
⑧Host把HttpServletResponse對象返回給Engine;
⑨Engine把HttpServletResponse對象返回Connector;
⑩Connector把HttpServletResponse對象返回給客戶Browser;
說白了,更虛擬主機差很少一個意思。方法以下:
[root@localhost ~]# cp -ra /usr/local/tomcat/ /usr/local/tomcat2 [root@localhost ~]# vim /usr/local/tomcat2/conf/server.xml 22 <Server port="8006" shutdown="SHUTDOWN"> //將本來的8005改成8006 69 <Connector port="8081" protocol="HTTP/1.1" //將本來的808端口改成8081 70 connectionTimeout="20000" 71 redirectPort="8444" /> //將本來的8443改成8444 116 <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" /> //將本來的8009改成80十、8443改成8444 //行首爲行號,修改配置文件,以避免端口衝突 [root@localhost ~]# /usr/local/tomcat2/bin/startup.sh //啓動第二個tomcat實例 [root@localhost ~]# netstat -anpt | grep 8081 //經過配置文件的修改,監聽的端口爲8081 tcp6 0 0 :::8081 :::* LISTEN 57572/java
客戶端訪問測試:
說白了就是訪問指定路徑的文件。方法以下:
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //編輯tomcat服務主配置文件 148 <Host name="localhost" appBase="webapps" 149 unpackWARs="true" autoDeploy="true"> 150 <Context path = "/shop" docBase = "/data/project" debug = "0" reloadable = "false" crossContext = "true"> 151 </Context> //添加150行和151行便可! //path:指出訪問的路徑; docBase:指定文件存放的路徑; //debug:指出debug的等級爲輸出信息最少,9提供最多信息; //reloadable:爲true時當web.xml文件有改動時將會自動從新加載,不準重啓服務; //crossContext:爲true時,表示不一樣的context共享一個session(會話池) [root@localhost ~]# mkdir /data/project -p [root@localhost ~]# echo "<h1>hello word</h1>" >> /data/project/index.jsp //建立測試頁面 [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓tomcat服務
客戶端訪問測試:
Tomcat默認禁止目錄遍歷的,測試以下:
[root@localhost ~]# mv /data/project/index.jsp /data/project/index1.jsp //改變默認首頁文件名
客戶端訪問,如圖:
若是須要開啓目錄遍歷功能,則需如下操做:
[root@localhost ~]# vim /usr/local/tomcat/conf/web.xml //注意:這個文件不是tomcat主配置文件 112 <param-value>true</param-value> //將本來的false改成true [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //從新啓動tomcat服務
客戶端訪問測試,如圖:
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //編輯tomcat服務主配置文件 152 <Context path="/jiankong" docBase="/data/jiankong" debug="0" reloadable=" false" crossContext="true"/> //上面已經解釋過了,這裏就不解釋了 [root@localhost ~]# mkdir /data/jiankong [root@localhost ~]# vim /data/jiankong/index.jsp //在指定目錄下編寫監控腳本 <% Runtime rtm = Runtime.getRuntime(); long mm = rtm.maxMemory()/1024/1024; long tm = rtm.totalMemory()/1024/1024; long fm = rtm.freeMemory()/1024/1024; out.println("JVM memory detail info :<br>"); out.println("Max memory:"+mm+"MB"+"<br>"); out.println("Total memory: "+tm+"MB"+"<br>"); out.println("Free memory: "+fm+"MB"+"<br>"); out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"<br>"); %> [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓tomcat服務
訪問測試,以下:
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh //編寫這個腳本 307CATALINA_OPTS=" $CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true" 308 309 # ----- Execute The Requested Command ----------------------------------------- //填寫的內容必須在這行上面 //port:監聽的端口; ssl:關閉ssl安全傳輸 authenticate:開啓用戶認證 [root@localhost ~]# cd //usr/local/jdk1.8.0_211/jre/lib/management/ [root@localhost management]# cp jmxremote.password.template jmxremote.password [root@localhost management]# vim jmxremote.password //定義用戶的文件並在文件末尾添加如下內容 64 lzj 123456 //64爲行號,定義用戶爲lzj,密碼爲123456,使用「wq!」強制保存退出 [root@localhost management]# vim jmxremote.access //定義用戶權限的文件 77 lzj readwrite \ //將本來的用戶定義爲剛纔定義的用戶lzj 78 create javax.management.monitor.*,javax.management.timer.* \ 79 unregister [root@localhost management]# chmod 600 jmxremote.access [root@localhost management]# chmod 600 jmxremote.password //更改這兩個配置文件的權限爲600 [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓tomcat服務 [root@localhost ~]# netstat -anpt | grep 8888 tcp6 0 0 :::8888 :::* LISTEN 58760/java //確認剛纔定義的端口8888在監聽
因爲其爲圖像化界面,因此須要在桌面環境下執行如下命令:
[root@localhost ~]# jconsole //調出圖形化終端
[root@localhost ~]# keytool -genkey -v -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/conf/tomcat.keystore -validity 36500 //alias:別名,這裏設置爲tomcat; //keyalg:證書算法,RSA; //validity:證書有效期,單位爲天 //keystore:指定證書存放路徑,能夠自定義 輸入密鑰庫口令: //實驗環境,如下內容隨意輸入 再次輸入新口令: 您的名字與姓氏是什麼? [Unknown]: lv 您的組織單位名稱是什麼? [Unknown]: lv 您的組織名稱是什麼? [Unknown]: lv\ 您所在的城市或區域名稱是什麼? [Unknown]: lv 您所在的省/市/自治區名稱是什麼? [Unknown]: lv 該單位的雙字母國家/地區代碼是什麼? [Unknown]: lv CN=lv, OU=lv, O="lv\\", L=lv, ST=lv, C=lv是否正確? [否]: y 正在爲如下對象生成 2,048 位RSA密鑰對和自簽名證書 (SHA256withRSA) (有效期爲 36,500 天): CN=lv, OU=lv, O="lv\\", L=lv, ST=lv, C=lv 輸入 <tomcat> 的密鑰口令 (若是和密鑰庫口令相同, 按回車): 再次輸入新口令: [正在存儲/usr/local/tomcat/conf/tomcat.keystore] Warning: JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore /usr/local/tomcat/conf/tomcat.keystore -destkeystore /usr/local/tomcat/conf/tomcat.keystore -deststoretype pkcs12" 遷移到行業標準格式 PKCS12。 [root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //內容能夠自行編寫,也可修改本來的配置,注意將其註釋去掉 87 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" //將本來的8443改成443 88 maxThreads="150" SSLEnabled="true" 89 keystoreFile="/usr/local/tomcat/conf/tomcat.keystore" //指定證書存放路徑 90 keystorePass="123456"> //指定生成證書所輸入的密碼 91 </Connector> [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓tomcat服務
客戶端訪問測試:
在訪問Tomcat的默認首頁界面時,有一個「Manager App」,如圖:
接下來經過配置開啓Tomcat的manager管理頁面,方法以下:
[root@localhost ~]# vim /usr/local/tomcat/conf/tomcat-users.xml 45 <role rolename="manager-gui"/> 46 <user username="lzj" password="123456" roles="manager-gui"/> //自定義用戶名和密碼 47 </tomcat-users> //注意要寫在這個閉合中 [root@localhost ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml 20 allow="192.168.1.253|192.168.1.8|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> //將須要訪問的IP的地址添加到「allow=」後,以「|」進行分隔 [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //從新啓動Tomcat服務
客戶端訪問測試:
準備war包添加到自定義的目錄中!
[root@localhost ~]# echo "hello word" >> index.jsp [root@localhost ~]# jar -vcf index.war index.jsp //作成war包,並命名爲index.war
在web圖形頁面進行添加war包:
方法跟開啓manger管理頁面差很少,方法以下:
修改服務器的配置文件:
[root@localhost ~]# vim /usr/local/tomcat/conf/tomcat-users.xml 45 <role rolename="admin-gui"/> 46 <user username="lzj" password="123456" roles="admin-gui"/> 47 </tomcat-users> //在末行的閉合標籤中,添加以上內容,用戶名和密碼定義 [root@localhost ~]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml 19 <Valve className="org.apache.catalina.valves.RemoteAddrValve" 20 allow="192.168.1.253|192.168.1.8|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> //添加容許訪問的IP地址 [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓服務
客戶端訪問測試:
對Tomcat進行日誌跟Apache作日誌分割差很少,不過Tomcat自己並無日誌分割工具,須要使用第三方日誌分割工具——cronolog日誌分割工具
操做以下:
[root@localhost ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/cronolog-1.6.2/ [root@localhost cronolog-1.6.2]# ./configure && make && make install //編譯安裝cronolog工具 [root@localhost cronolog-1.6.2]# which cronolog //查詢到該命令的絕對路徑 /usr/local/sbin/cronolog [root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh 471 org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog /usr/local/tomcat/logs/test.%Y-%m-%d.out >> /dev/null & //將本來的內容修改成以上內容 472 473 #>> "$CATALINA_OUT" 2>&1 "&" //將這行內容進行註釋 [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh [root@localhost ~]# ll /usr/local/tomcat/logs/ 總用量 380 -rw-r----- 1 root root 159033 12月 8 16:51 catalina.2019-12-08.log -rw-r----- 1 root root 140209 12月 8 16:51 catalina.out -rw-r----- 1 root root 162 12月 8 15:10 host-manager.2019-12-08.log -rw-r----- 1 root root 8722 12月 8 16:51 localhost.2019-12-08.log -rw-r----- 1 root root 6071 12月 8 15:10 localhost_access_log.2019-12-08.txt -rw-r----- 1 root root 1719 12月 8 14:41 manager.2019-12-08.log -rw-r----- 1 root root 18824 12月 8 16:51 test.2019-12-08.out //確認這個文件存在
默認狀況下,客戶端訪問Tomcat服務器上一個不存在的目錄時,就會提示404錯誤,並且會將咱們Tomcat的版本信息顯示出來,這是很是危險的。默認的404返回的錯誤頁面以下:
解決的方法也很簡單,就是將404狀態碼進行重定向,以便咱們自定義返回的頁面信息,方法以下:
[root@localhost ~]# echo "Access Error ..." >> /usr/local/tomcat/webapps/ROOT/error.jsp //自定義錯誤頁面內容 [root@localhost ~]# vim /usr/local/tomcat/conf/web.xml 22 version="3.1"> //在這行內容的下面添加如下內容 23 <error-page> 24 <error-code>404</error-code> 25 <location>/error.jsp</location> 26 </error-page> [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh
客戶端訪問以下:
方法以下:
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh 1 #!/bin/sh //在第一行下面添加如下內容 2 JAVA_OPTS="-Dfile.encoding=UTF-8 3 -server 4 -Xms1023M 5 -Xmx1024M 6 -XX:NewSize=512M 7 -XX:MaxNewSize=1020M 8 -XX:NewRatio=2 9 -XX:ParallelGCThreads=15 10 -XX:+DisableExplicitGC" [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重啓Tomcat服務以後,能夠實時監控JVM虛擬機資源進行驗證
若是使用的是Tomcat8.0以前的版本,還需添加兩個配置項,8.0之後的版本就被移除了:
-XX:PermSize=256M -XX:MaxPermSize=356M
配置文件中添加的各個配置項解釋以下:
- -Xms:表示 JVM初始內存大小,也能夠說是Java 初始化堆的大小,-Xms 與-Xmx 設成同樣的值,避免 JVM 反覆從新申請內存,致使性能大起大落,默認值爲物理內存的 1/64;
- -Xmx:表示最大 Java 堆大小,當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰,所以通常建議堆的最大值設置爲可用內存的最大值的80%;
- -Xmn:設置JVM最小內存(128-256就夠了,通常不設置);
- -XX:NewSize:設置新生代內存大小。 新生代,對象新建立的時候分配的內存空間,老生代在垃圾回收器回收事後該對象依然沒有被回收,該對象就會移動到老生代;
- -XX:PermSize:設置持久代內存大小,用於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應 用可能動態生成或者調用一些class,持久帶也稱爲方法區,方法區存儲每個java類的結構信息:好比運行時常量池,字段和方法數據,構造函數和普通方法的字節碼內容以及類、實例、接口初始化時須要使用到的特殊方法等數據,JDK8中已經把持久代(PermGen Space) 幹掉了,取而代之的元空間(Metaspace)。Metaspace佔用的是本地內存,再也不佔用虛擬機內存;
- -XX:MaxPermSize:設置最大值持久代內存大小,永久代不屬於堆內存,堆內存只包含新生代和老年代;
- -XX:NewRatio:改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認爲8);
- -XX:ParallelGCThreads 可用來增長並行度,須要多cpu;
- -XX:+DisableExplicitGC:關閉System.gc(),簡單理解就是關閉java中的內存回收機制;
方法以下:
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml 53 <Service name="Catalina"> //在這行內容下添加如下內容 54 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads= "500" minSpareThread="4"/> 70 <Connector port="8080" protocol="HTTP/1.1" 71 executor="tomcatThreadPool" //調用剛纔定義的規則,需手動添加 72 connectionTimeout="20000" 73 redirectPort="8443" /> 116 <!-- 117 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> //關閉AJPI接口本來存在,將其註釋便可! 118 -->
Excutor重要參數說明:
- name:共享線程池的名字,這是connector爲了共享線程池要引用的名字,該名稱必須惟一
- namePrefix:在JVM上,每運行線程均可以有一個name字符串,這一屬性爲線程池中每一個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴後面,默認值爲tomcat-exec-
- maxThreads:該線程池能夠容納的最大線程數,默認200
- minSpareThreads:Tomcat應該始終打開的最小不活躍線程數,默認25
Connector參數說明:- executor:表示使用參數值對應的線程池。
AJP是爲Tomcat與HTTP服務器之間通訊而定製的協議,可以提供較高的通訊速度與效率。若是Tomcat前端放的Apache的時候,會使用到這個AJP鏈接器。
Tomcat支持的三種請求方式:
APR提供的主要功能模塊包括:內存分配及內存池、原子操做、文件I/O、鎖、內存映射、哈希表、網絡I/O、輪詢、進程及線程操做等等,經過採用APR,Tomcat能夠得到高度可擴展性以及優越的性能,而且能夠更好的與本地服務器技術集成,從而可使Tomcat做爲一款通用的Web服務器使用,而不只僅做爲輕量級應用服務器。在這種狀況下,Java將再也不是一門側重於後端的編程語言,也能夠更多的用於成熟的Web服務器平臺。
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" //修改本來的protocol內容 executor="tomcatThreadPool" //添加這行內容 connectionTimeout="20000" redirectPort="8443" /> [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh [root@localhost ~]# /usr/local/tomcat/bin/startup.sh
查看其「catalina.out」日誌,有如下字樣,則表示是在nio接收請求處理方式,以下(因爲上面對Tomcat日誌進行了分割操做,因此須要查看test.2019-12-08.out日誌文件):
啓用這種凡是稍微麻煩一些,須要安裝一些依賴(本人使用的CentOS 7.3版本)。
[root@localhost ~]#yum -y install apr-devel openssl-devel gcc make //安裝所需依賴 [root@localhost ~]# tar zxf apr-1.5.2.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/apr-1.5.2/ [root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr && make && make install //編譯安裝apr [root@localhost ~]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/apr-util-1.5.4/ [root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install //編譯安裝apr-util [root@localhost apr-util-1.5.4]# cd /usr/local/tomcat/bin/ [root@localhost bin]# tar zxf tomcat-native.tar.gz [root@localhost bin]# cd tomcat-native-1.2.18-src/native/ [root@localhost native]# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/jdk1.8.0_211 && make && make install //編譯安裝tomcat自帶的tomcat-native軟件包 [root@localhost ~]# vim /etc/profile //編寫環境變量,添加如下內容 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib [root@localhost ~]# source /etc/profile [root@localhost ~]# cd /usr/local/tomcat/ [root@localhost tomcat]# openssl genrsa -out ca.key 4096 //生成所需祕鑰 [root@localhost tomcat]# openssl req -new -x509 -days 7304 -key ca.key -out ca.crt //經過所需祕鑰生成數字證書 [root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //編寫tomcat主配置文件 104 <Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" //更改端口爲443 105 maxThreads="150" SSLEnabled="true" > 106 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> //升級爲http 2.0協議 107 <SSLHostConfig> 108 <Certificate certificateKeyFile="/usr/local/tomcat/ca.key" //更改祕鑰存放路徑 109 certificateFile="/usr/local/tomcat/ca.crt" //更改證書存放路徑 110 type="RSA" /> 111 </SSLHostConfig> 112 </Connector> [root@localhost logs]# /usr/local/tomcat/bin/shutdown.sh [root@localhost logs]# /usr/local/tomcat/bin/startup.sh //從新啓動tomcat服務 [root@localhost ~]# netstat -anpt | grep 443 //確認443端口在監聽 tcp6 0 0 :::443 :::* LISTEN 17206/java
客戶端使用https協議進行訪問,如圖:
[root@localhost ~]# cat /usr/local/tomcat/logs/test.2019-12-09.out | grep apr //根據查看tomat的日誌來了解tomcat的工做模式
如圖:
關於BIO模式,如今已經不多使用了,因此這裏就不介紹了!
———————— 本文至此結束,感謝閱讀 ————————