Tomcat簡(jiǎn)介
Tomcat 是 JAVA 語(yǔ)言開(kāi)發(fā)的,Tomcat 服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的 Web 應(yīng)用服務(wù)器,是 Apache 軟件基金會(huì)的 Jakarta 項(xiàng)目中的一個(gè)核心項(xiàng)目,由 Apache、Sun 和其他一些公司及個(gè)人共同開(kāi)發(fā)而成。
Tomcat 屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試 JSP 程序的首選。一般來(lái)說(shuō),Tomcat 雖然和 Apache 或者 Nginx 這些 Web 服務(wù)器一樣,具有處理 html 頁(yè)面的功能,然而由于其處理靜態(tài) HTML 的能力遠(yuǎn)不及 Apache 或者 Nginx,所以 Tomcat 通常是作為一個(gè) Servlet 和 JSP 容器,單獨(dú)運(yùn)行在后端。
Tomcat核心組件
Web 容器:完成 Web 服務(wù)器的功能。
Servlet 容器:名字為 catalina,用于處理 Servlet 代碼。
JSP 容器:用于將 JSP 動(dòng)態(tài)網(wǎng)頁(yè)翻譯成 Servlet 代碼。
因此 Tomcat 是 Web 應(yīng)用服務(wù)器,也是一個(gè) Servlet/JSP 容器。Tomcat 作為 Servlet 容器,負(fù)責(zé)處理客戶請(qǐng)求,把請(qǐng)求傳送給 Servlet,并將 Servlet 的響應(yīng)傳送回給客戶。
Web容器
web容器是一種服務(wù)程序,在服務(wù)器一個(gè)端口就有一個(gè)提供相應(yīng)服務(wù)的程序,而這個(gè)程序就是處理從客戶端發(fā)出的請(qǐng)求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是這樣的容器。一個(gè)服務(wù)器可以有多個(gè)容器。
什么是 servlet?
Servlet 是Java Servlet 的簡(jiǎn)稱,可以理解為是一個(gè)服務(wù)連接器,是用 Java 編寫(xiě)的服務(wù)器端程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性, 簡(jiǎn)單的理解:servlet 就是一個(gè)中間件,包含了接口和方法,將客戶端和數(shù)據(jù)庫(kù)連接,從而實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)的創(chuàng)建。
什么是 JSP?
JSP 全稱 Java Server Pages,是一種動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。它使用 JSP 標(biāo)簽在HTML網(wǎng)頁(yè)中插入 Java 代碼。
標(biāo)簽通常以 <% 開(kāi)頭,以 %> 結(jié)束。
JSP 是一種 Java servlet,主要用于實(shí)現(xiàn) Java web 應(yīng)用程序的用戶界面部分。
JSP 通過(guò)網(wǎng)頁(yè)表單獲取用戶輸入數(shù)據(jù)、訪問(wèn)數(shù)據(jù)庫(kù)及其他數(shù)據(jù)源,然后動(dòng)態(tài)地創(chuàng)建網(wǎng)頁(yè)。
ContAIner 結(jié)構(gòu)分析
每個(gè) Service 會(huì)包含一個(gè) Container 容器。在 Container 內(nèi)部包含了 4 個(gè)子容器:
4個(gè)子容器的作用分別是:
Engine:引擎,用來(lái)管理多個(gè)虛擬主機(jī),一個(gè) Service 最多只能有一個(gè) Engine;
Host:代表一個(gè)虛擬主機(jī),也可以叫站點(diǎn),通過(guò)配置 Host 就可以添加站點(diǎn);
Context:代表一個(gè) Web 應(yīng)用,包含多個(gè) Servlet 封裝器;
WrApper:封裝器,容器的最底層。每一 Wrapper 封裝著一個(gè) Servlet,負(fù)責(zé)對(duì)象實(shí)例的創(chuàng)建、執(zhí)行和銷(xiāo)毀功能。
Engine、Host、Context 和 Wrapper,這四個(gè)容器之間屬于父子關(guān)系。 容器 由一個(gè)引擎可以管理多個(gè)虛擬主機(jī)。每個(gè)虛擬主機(jī)可以管理多個(gè) Web 應(yīng)用。每個(gè) Web 應(yīng)用會(huì)有多個(gè) Servlet 封裝器。
Tomcat 請(qǐng)求過(guò)程:
用戶在瀏覽器中輸入網(wǎng)址,請(qǐng)求被發(fā)送到本機(jī)端口 8080,被在那里監(jiān)聽(tīng)的 Connector 獲得;
Connector 把該請(qǐng)求交給它所在的 Service 的 Engine(Container)來(lái)處理,并等待 Engine 的回應(yīng);
請(qǐng)求在 Engine、Host、Context 和 Wrapper 這四個(gè)容器之間層層調(diào)用,最后在 Servlet 中執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等。
執(zhí)行完之后的請(qǐng)求響應(yīng)在 Context、Host、Engine 容器之間層層返回,最后返回給 Connector,并通過(guò) Connector 返回給客戶端。
在部署 Tomcat 之前必須安裝好 jdk,因?yàn)?jdk 是 Tomcat 運(yùn)行的必要環(huán)境。
這里選擇手動(dòng)搭建tomcat環(huán)境.JDK選擇yum倉(cāng)庫(kù)的openJDK,大家也可以在官網(wǎng)下載RPM包安裝 http://www.oracle.com/tec.NETwork/java/javase/downloads/jdk8-downloads-2133151.html
一:安裝JDK
1:檢查yum倉(cāng)庫(kù)中openjdk的版本
[root@localhost ~]# yum list |grep ^java

這里選擇安裝java-1.8.0-openjdk
[root@localhost ~]# yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 -y

2:查看Java-Openjdk是否安裝成功
[root@localhost ~]# java -version

顯示已經(jīng)安裝成功
二:安裝配置Tomcat
1:檢查yum倉(cāng)庫(kù)中tomcat的相關(guān)包
[root@localhost ~]# yum list |grep tomcat

[root@localhost ~]# yum install tomcat -y 直接選擇在線安裝
也可以在官網(wǎng)下載源碼包 wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.83/bin/apache-tomcat-8.5.83.tar.gz
如果是下載源碼安裝就需要配置:配置 Tomcat 環(huán)境變量配置 Tomcat pid 文件和相關(guān)參數(shù)配置 Tomcat 服務(wù)腳本
Tomcat 環(huán)境變量
[root@localhost ~]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.83/bin/apache-tomcat-8.5.83.tar.gz [root@localhost ~]# tar xf apache-tomcat-8.5.83.tar.gz -C /usr/local [root@localhost ~]# cd /usr/local/ [root@localhost java]# ln -sv apache-tomcat-8.5.83/ tomcat ‘tomcat’ -> ‘apache-tomcat-8.5.83/’ 配置變量: [root@localhost local]# vim /etc/profile.d/tomcat.sh # TOMCAT export CATALINA_HOME=/usr/local/tomcat # PATH export PATH=$PATH:$CATALINA_HOME |
配置 Tomcat pid 文件和相關(guān)參數(shù)
[root@localhost local]# vim /usr/local/tomcat/bin/setenv.sh # add tomcat pid CATALINA_PID="$CATALINA_HOME/tomcat.pid" # add java opts JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=512m -Xms512M -Xmx512M -XX:MaxNewSize=256m" |
配置 Tomcat 服務(wù)腳本
[root@localhost]# vim /usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Web Application ContainerAfter=syslog.target network.target [Service] Type=forking PIDFile=/usr/local/tomcat/tomcat.pid ExecStart=/usr/local/tomcat/bin/catalina.sh start ExecReload=/bin/kill -s HUP MAINPID ExecStop=/bin/kill−s QUIT MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target 啟動(dòng)服務(wù): [root@localhost]# systemctl daemon-reload [root@localhost]# systemctl status tomcat.service [root@localhost]# systemctl enable tomcat.service [root@localhost]# systemctl is-enabled tomcat.service enabled [root@localhost]# systemctl start tomcat.service # 查看 Tomcat 開(kāi)啟端口狀態(tài) [root@localhost ~]# netstat -lnutp | grep :8080 tcp6 0 0 :::8080 :::* LISTEN 3060/java |
2:這里我選擇的是在線安裝:
[root@localhost ~]# yum install tomcat -y

[root@localhost ~]# systemctl start tomcat 啟動(dòng)tomcat


[root@localhost ~]# rpm -ql tomcat 查看yunm安裝的tomcat生成文件的路徑

tomcat默認(rèn)端口是8080,接下來(lái)瀏覽輸入地址:http://ip:8080/。這個(gè)頁(yè)面暫時(shí)是無(wú)法訪問(wèn)
由于tomcat的web頁(yè)面是需要安裝插件的,這里繼續(xù)用 tomcat-webapps 和 tomcat-admin-webapps 兩個(gè)插件包
[root@localhost ~]# yum install tomcat-webapps tomcat-admin-webapps -y

[root@localhost ~]# systemctl restart tomcat 重啟服務(wù)
在瀏覽器中輸入http://10.0.0.101:8080/

3:提升 Tomcat 啟動(dòng)速度
●tomcat 啟動(dòng)慢的原因是隨機(jī)數(shù)產(chǎn)生遭到阻塞,遭到阻塞的原因是 熵池大小 。
●/dev/random:阻塞型,讀取它就會(huì)產(chǎn)生隨機(jī)數(shù)據(jù),但該數(shù)據(jù)取決于熵池噪聲,當(dāng)熵池空了,對(duì)/dev/random 的讀操作也將會(huì)被阻塞。
●/dev/urandom:非阻塞的隨機(jī)數(shù)產(chǎn)生器,它會(huì)重復(fù)使用熵池中的數(shù)據(jù)以產(chǎn)生偽隨機(jī)數(shù)據(jù)。這表示對(duì)/dev/urandom的讀取操作不會(huì)產(chǎn)生阻塞,但其輸出的熵可能小于/dev/random的。它可以作為生成較低強(qiáng)度密碼的偽隨機(jī)數(shù)生成器,不建議用于生成高強(qiáng)度長(zhǎng)期密碼。
# 查看是否有足夠的熵來(lái)用于產(chǎn)生隨機(jī)數(shù)
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
1418
# 安裝rngd服務(wù)(熵服務(wù),增大熵池)
[root@localhost ~]# yum install rng-tools
# 開(kāi)機(jī)自啟動(dòng)服務(wù)
[root@localhost ~]# systemctl enable --now rngd
# 再次查看
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
2835

我們也可以在編輯/etc/tomcat/tomcat-users.xml配置文件來(lái)查看跟詳細(xì)的狀態(tài)頁(yè)面,但是這種配置不要使用在生產(chǎn)環(huán)境中
[root@localhost ~]#vim /etc/tomcat/tomcat-users.xml
# 添加如下內(nèi)容 [root@localhost local]# vim /etc/tomcat/tomcat-users.xml <role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-jmx"/> <role rolename="manager-script"/> <role rolename="manager-status"/> <user username="tomcat" password="tomcat" roles="admin-gui,manager-gui,managerjmx,manager-script,manager-status,admin-script"/> # 允許訪問(wèn) Manager App [root@localhost local]# vim /var/lib/tomcat/webapps/host-manager/META-INF/context.xml <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> # 允許訪問(wèn) Host Manager [root@localhost local]# vim /var/lib/tomcat/webapps/manager/META-INF/context.xml <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> # 重啟 Tomcat 服務(wù) [root@node01 local]# systemctl restart tomcat |
4:Tomcat 虛擬主機(jī)配置
修改 server.xml
[root@localhost ~]# systemctl stop tomcat
[root@localhost /]# cd /etc/tomcat
[root@localhost ]# cp server.xml{,.bak}
# 添加虛擬主機(jī)配置
[root@localhost]# vim server.xml </Host> <Host name="www.a.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="/web/a" path="" reloadable="flase" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.a.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.b.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="/web/b" path="" reloadable="flase" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.b.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> |
虛擬主機(jī)目錄及文件準(zhǔn)備
[root@localhost]# mkdir -p /web/{a,b} [root@localhost]# vim /web/a/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP a page</title> </head> <body> <% out.println("Welocome to test site,http://www.a.com");%> </body> </html> [root@localhost]# vim /web/b/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP a page</title> </head> <body> <% out.println("Welocome to test site,http://www.b.com");%> </body> </html> |
配置 hosts 解析
[root@localhost]# vim /etc/hosts
# 添加:
10.0.0.101 www.a.com www.b.com
重啟 Tomcat
[root@localhost]# systemctl restart tomcat.service
測(cè)試
[root@localhost]# curl www.a.com
5:Tomcat 配置文件參數(shù)優(yōu)化
常用的優(yōu)化相關(guān)參數(shù)如下:
【redirectPort】如果某連接器支持的協(xié)議是HTTP,當(dāng)接收客戶端發(fā)來(lái)的HTTPS請(qǐng)求時(shí),則轉(zhuǎn)發(fā)至此屬性定義的 8443 端口。
【maxThreads】Tomcat使用線程來(lái)處理接收的每個(gè)請(qǐng)求,這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù),即支持的最大并發(fā)連接數(shù),默認(rèn)值是 200。
【minSpareThreads】最小空閑線程數(shù),Tomcat 啟動(dòng)時(shí)的初始化的線程數(shù),表示即使沒(méi)有人使用也開(kāi)這么多空線程等待,默認(rèn)值是 10。
【maxSpareThreads】最大備用線程數(shù),一旦創(chuàng)建的線程超過(guò)這個(gè)值,Tomcat就會(huì)關(guān)閉不再需要的socket線程。默認(rèn)值是-1(無(wú)限制)。一般不需要指定。
【processorCache】進(jìn)程緩沖器,可以提升并發(fā)請(qǐng)求。默認(rèn)值是200,如果不做限制的話可以設(shè)置為-1,一般采用maxThreads的值或者-1。
【URIEncoding】指定 Tomcat 容器的 URL 編碼格式,網(wǎng)站一般采用UTF-8作為默認(rèn)編碼。
【connnectionTimeout】網(wǎng)絡(luò)連接超時(shí),單位:毫秒,設(shè)置為 0 表示永不超時(shí),這樣設(shè)置有隱患的。通常默認(rèn) 20000 毫秒就可以。
【enableLookups】是否反查域名,以返回遠(yuǎn)程主機(jī)的主機(jī)名,取值為:true 或 false,如果設(shè)置為 false,則直接返回 IP 地址,為了提高處理能力,應(yīng)設(shè)置為 false。
【disableUploadTimeout】上傳時(shí)是否使用超時(shí)機(jī)制。應(yīng)設(shè)置為 true。
【connectionUploadTimeout】上傳超時(shí)時(shí)間,畢竟文件上傳可能需要消耗更多的時(shí)間,這個(gè)根據(jù)你自己的業(yè)務(wù)需要自己調(diào),以使Servlet有較長(zhǎng)的時(shí)間來(lái)完成它的執(zhí)行,需要與上一個(gè)參數(shù)一起配合使用才會(huì)生效。
【acceptCount】指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可傳入連接請(qǐng)求的最大隊(duì)列長(zhǎng)度,超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理,默認(rèn)為 100 個(gè)。
【maxKeepAliveRequests】指定一個(gè)長(zhǎng)連接的最大請(qǐng)求數(shù)。默認(rèn)長(zhǎng)連接是打開(kāi)的,設(shè)置為1時(shí),代表關(guān)閉長(zhǎng)連接;為-1時(shí),代表請(qǐng)求數(shù)無(wú)限制
【compression】是否對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行GZIP壓縮,off:表示禁止壓縮;on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進(jìn)行壓縮,默認(rèn)值為 off,壓縮數(shù)據(jù)后可以有效的減少頁(yè)面的大小,一般可以減小 1/3 左右,節(jié)省帶寬。
【compressionMinSize】表示壓縮響應(yīng)的最小值,只有當(dāng)響應(yīng)報(bào)文大小大于這個(gè)值的時(shí)候才會(huì)對(duì)報(bào)文進(jìn)行壓縮,如果開(kāi)啟了壓縮功能,默認(rèn)值就是 2048。
【compressableMimeType】壓縮類型,指定對(duì)哪些類型的文件進(jìn)行數(shù)據(jù)壓縮。
【noCompressionUserAgents="gozilla, traviata"】對(duì)于以下的瀏覽器,不啟用壓縮