轉自:博客園駿馬金龍https://www.cnblogs.com/f-ck-need-u/p/7717488.html
1. 基礎背景知識
1.1 java和jdk概念
不管是何種程序,要能在計算機上運行,必須能轉換爲二進制的機器語言才能和硬件進行交互,在機器語言的上層是彙編語言,再上層是C/C++這樣較底層的語言,因爲它們嚴重依賴於平臺架構,全部通常只能運行在程序源代碼已編譯的機器上,可移植性比較差。javascript
Java是一種面向對象的語言,它的層次比C更高一點,層次指的是離硬件更遠一點。它將寫好的程序文件(.java)經過java編譯器javac編譯成字節碼類型的class文件(.class),在編譯過程當中涉及詞法分析、語法分析、語義分析、字節碼生成等過程,最終生成字節碼的class文件。class文件是Java的類文件,是編譯成功後的字節碼文件,字節碼由Java虛擬機JVM解釋執行,它將每一條字節碼送給解釋器,再翻譯成機器語言,從而在特定的機器上運行。Java經過JVM的方式實現了一次編譯處處運行的功能。css
即:html
源碼XXX.java-->javac編譯器-->字節碼XXX.class-->JVM-->機器語言(依賴於不一樣平臺)-->執行
JRE(Java Runtime Environment)是包含了JVM和其餘一些簡單功能的JAVA運行環境,它適用於只運行java程序時。JDK(Java Development Kit)比JRE包含了更多東西,它除了能做爲JAVA運行環境,還提供了不少用於開發的工具,因此它適用於開發程序時使用。前端
JAVA SE是java開發標準版,裏面有JDK,Java EE是企業版,本質上ee只是比se多提供了幾個類庫而已。java
1.2 jsp、servlet是什麼
在web應用程序上,早期Java的實現方式是服務器端放置應用程序,客戶端訪問時將其下載到客戶端本地並執行,這樣不只不安全,並且要求客戶有java運行環境,這種實現方式是applet。linux
與applet相對的是servlet,但它是服務端程序。後來,java將應用程序放在服務器端,客戶端請求此應用程序時,服務端經過servlet類庫分析http協議,將請求的應用程序在服務端執行,而後將結果組織起來返回給客戶端,但此時servlet能分析的http協議很是簡單,且和html的組織方式很是不友好,它要求java程序員首先得懂html開發(實際上如今仍是如此,java程序員至少要懂簡單的html/css/javascript等前端技術),因而後來出現了JSP類庫。nginx
JSP能夠簡單的將java代碼嵌入在html文檔中,它們可以很友好地結合,結合後的文檔類型爲.jsp文件。當客戶端請求應用程序資源時,JSP類庫負責解析.jsp文件中的jsp部分並經過jasper組件將其翻譯成servlet的java源代碼,而後再編譯成class文件並交給JVM來執行。實際上,jsp的本就就是servlet,jsp類只不過是繼承於servlet類並添加了一些和html友好結合的特性,最終它仍是要翻譯成servlet代碼。程序員
JSP的本質仍是Servlet,每一個JSP頁面就是一個Servlet對象(固然也可能引用了其餘servlet對象),Servlet再負責響應用戶的動態請求數據(其實也包括靜態數據,由於jasper翻譯jsp代碼時,靜態標籤也被翻譯到servlet的java源文件中以待輸出)。對於Tomcat而言,JSP頁面生成的Servlet放在work路徑對應的Web應用下。web
考慮到tomcat和httpd、nginx等http服務程序的對比,有兩點須要明確:docker
(1).一個java程序只有一個進程,可是能夠有多個線程,也就是說java程序的開發是基於線程的。那惟一的進程就是JVM進程,每一個應用程序都開啓一個JVM進程,根據開發時設計的多線程代碼,在這個JVM進程中會啓動多個線程。它不像httpd或nginx,能開啓多進程(對於tomcat而言,這意味着多個不一樣的應用程序甚至意味着開啓多個tomcat實例)。
(2).tomcat能夠處理動態請求,也能夠處理靜態資源請求。但不管是動態資源,仍是靜態資源的請求,都是通過servlet處理並響應給客戶端的,只不過請求靜態資源時使用的是默認的servlet。雖然它能像httpd和nginx同樣處理靜態資源,但顯然,它既要處理動態請求,又要處理靜態請求,壓力會很大。所以tomcat前通常使用httpd或nginx專門處理靜態請求,而動態請求則經過反向代理的方式代理至tomcat。
1.3 web服務器、web容器、應用程序服務器
web服務器用於提供web服務,要求能解析http協議,一般認爲提供靜態內容的服務器是web服務器。如apache httpd、nginx等。
對於java而言,web容器是能提供servlet容器的服務器,它們是等價的概念。常見的有tomcat、weblogic、websphere、jboss。其中tomcat只提供servlet容器,它們在功能上是等價的。除tomcat外,後面3種web容器還提供除servlet容器外的EJB容器,專用於大型分佈式程序開發。
應用程序服務器是用於提供應用服務的服務器。這是業務邏輯上的概念劃分。更具體一點的說,它提供WEB容器(servlet容器)、EJB容器以及其餘功能。
它們之間的關係和功能大體以下:web服務器提供web服務,主要處理http請求並響應給客戶端,並能夠將動態請求委託給其餘程序,如cgi腳本、jsp腳本、asp腳本等進行處理;web容器即servlet容器主要負責處理基於http請求的動態jsp內容;EJB容器主要提供和後端數據庫服務、其餘服務進行交互的功能;應用服務器一般來講包括servlet容器或EJB容器,它們都運行於支持Java的應用服務器中,所以tomcat/weblogic/websphere/jboss都算是應用服務器。
1.4 tomcat體系結構
tomcat是jdk+servlet(嚴格地說是+jsp)實現的精簡版的java ee,因爲它只在jdk的基礎上附加了jsp和servlet類庫,因此它的應用範圍主要是web應用。tomcat項目目前由apache軟件基金會維護。
它是一種應用程序服務器,只提供servlet容器,同時還提供apache解析靜態HTML,只不過之它的處理能力不如獨立的apache服務器。相似的應用程序服務還有websphere/weblogic/jetty/resin/jboss等,它們都是在jdk基礎上附加各類類庫實現不一樣程度的java ee(tomcat=jdk+servlet)。
對於tomcat來講,它高度模塊化,經過各個組件實現各類功能。它的體系結構以下圖所示:
其中:
- server是頂級類,一個server算是一個tomcat實例,在此層次中可定義tomcat服務的監聽端口。
- service是server下的子組件,用於封裝綁定connector和containor,併爲它們提供一個名稱屬性。有了service就能夠提供相關的服務,如監聽TCP鏈接請求、處理http請求。注意server是管理整個tomcat實例的層次,它和提供服務沒有關係。
- connector是鏈接器,定義http協議(默認)以及該協議的監聽端口。鏈接器用於接收客戶端請求並將containor處理的數據返回給客戶端。
- containor稱爲容器,它和connector鏈接器進行綁定。該容器內有4個子容器,包括:engine容器、host容器、context容器、Wrapper容器。容器用於分析、處理請求,並構建響應給connector以發送給客戶端。它和connector是tomcat的心臟組件。
- engine容器定義servlet引擎,用於定義引擎的名稱、默認的虛擬主機。引擎用於分析http請求並將請求轉發給對應的虛擬主機。
- host容器用於定義虛擬主機。
- context容器用於定義webapp,一個context定義一個webapp。它是真正管理servlet容器的層次。
- wrapper容器對應的是真正的servlet容器,一個wrapper表明一個servlet,它負責管理一個Servlet,包括的Servlet的裝載、初始化、執行以及資源回收。Wrapper是最底層的容器,一個context只能包含一個wrapper。在配置文件中,沒法配置該容器的屬性。
還有一些其餘組件,如session管理組件、JMX等。
一個server能夠有多個service。一個service能夠有多個connector和惟一的containor。containor是容器類,從containor層次開始,真正進入servlet容器相關的過程。它包含了惟一的engine容器,engine容器中包含了一個或多個host容器,host容器中包含了一個或多個context容器,context容器中包含了惟一的wrapper。它們的組織結構大體以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<server> <service> <connector /> <engine> <host> <context /> <context /> </host> <host> <context /> </host> </engine> </service> <service> ...... </service> </server>
2. 安裝tomcat
tomcat依賴於jdk,因此須要先安裝jdk。tomcat和jdk版本之間存在對應關係,應該考慮好要安裝哪一個版本的jdk以及哪一個版本的tomcat。官方給出的對應關係網址爲:https://tomcat.apache.org/whichversion.html。如下是到tomcat 9.x版本和jdk的對應表。
本文jdk以jdk-8u131爲例,表示版本爲8的第131次更新,tomcat以apache-tomcat-8.5.14爲例。
2.1 安裝jdk
下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
以rpm包的爲例。
shell> yum localinstall -y jdk-8u131-linux-x64.rpm
安裝路徑爲/usr/java。在該路徑有3個文件,其中兩個是版本號的軟連接。
1
2
3
4
5shell> ll /usr/java total 4 lrwxrwxrwx 1 root root 16 May 4 22:54 default -> /usr/java/latest drwxr-xr-x 9 root root 4096 May 4 22:54 jdk1.8.0_131 lrwxrwxrwx 1 root root 22 May 4 22:54 latest -> /usr/java/jdk1.8.0_131
經過這種軟連接方式,之後有新版jdk要安裝,直接改latest的連接對象便可。
在安裝目錄的Bin目錄下,有不少可執行程序,包括javac(java編譯器),java(java主程序,其中包括JVM),jps(查看當前java進程及pid,因此能夠查看java進程數)。
1
2
3
4
5
6
7shell> ls latest/bin/ appletviewer idlj java javafxpackager javapackager jcmd jdb jinfo jmc jrunscript jstat keytool pack200 rmid serialver unpack200 xjc ControlPanel jar javac javah java-rmi.cgi jconsole jdeps jjs jmc.ini jsadebugd jstatd native2ascii policytool rmiregistry servertool wsgen extcheck jarsigner javadoc javap javaws jcontrol jhat jmap jps jstack jvisualvm orbd rmic schemagen tnameserv wsimport
執行java -version
能夠驗證jdk工具是否安裝成功。
1
2
3
4[root@xuexi jdk1.8.0_131]# bin/java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
而後再設置JAVA_HOME環境變量並導出java程序所在目錄的PATH環境變量。
1
2
3
4
5
6
7
8shell> echo 'export JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh shell> echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh shell> . /etc/profile.d/jdk.sh shell> java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
2.2 安裝tomcat
直接解壓便可。
1
2shell> tar xf apache-tomcat-8.5.14.tar.gz -C /usr/local/ shell> ln -s /usr/local/apache-tomcat-8.5.14 /usr/local/tomcat
安裝完後,有如下幾個文件和目錄。
1
2
3
4
5
6
7
8
9
10shell> cd /usr/local/tomcat [root@xuexi tomcat]# ll -d */ drwxr-x--- 2 root root 4096 May 4 23:36 bin/ drwx------ 2 root root 4096 Apr 13 20:58 conf/ drwxr-x--- 2 root root 4096 May 4 23:36 lib/ drwxr-x--- 2 root root 4096 Apr 13 20:55 logs/ drwxr-x--- 2 root root 4096 May 4 23:36 temp/ drwxr-x--- 7 root root 4096 Apr 13 20:56 webapps/ drwxr-x--- 2 root root 4096 Apr 13 20:55 work/
logs目錄是日誌目錄。temp是臨時目錄。webapps是存放web程序的根目錄。work目錄是存放編譯後生成的class文件的目錄。bin目錄下有不少腳本文件,有.sh腳本,也有.bat腳本。
1
2
3[root@xuexi tomcat]# ls bin/ bootstrap.jar catalina.sh commons-daemon.jar configtest.bat daemon.sh digest.sh setclasspath.sh shutdown.sh startup.sh tomcat-native.tar.gz tool-wrapper.sh version.sh catalina.bat catalina-tasks.xml commons-daemon-native.tar.gz configtest.sh digest.bat setclasspath.bat shutdown.bat startup.bat tomcat-juli.jar tool-wrapper.bat version.bat
其中:
- catalina.sh相似於SysV服務管理腳本,支持stop、start和configtest,但不支持restart和reload,如
catalina.sh start
。 - startup.sh等價於
catalina.sh start
。 - shudown.sh等價於
catalina.sh stop
。 - configtest.sh等價於
catalina.sh configtest
。 - daemon.sh是經過指定各類PATH參數將tomcat以daemon的方式運行,要指定的參數path較多。catalina.sh執行start也是在後臺運行tomcat的,因此沒有必要使用此腳原本實現daemon模式的tomcat。
在安裝目錄下的conf目錄下有幾個配置xml格式的配置文件。
1
2[root@xuexi tomcat]# ls conf/ catalina.policy catalina.properties context.xml jaspic-providers.xml jaspic-providers.xsd logging.properties server.xml tomcat-users.xml tomcat-users.xsd web.xml
其中server.xml是主配置文件,tomcat-users.xml是狀態監控和gui界面管理的身份認證配置文件,後面會有相關配置說明,web.xml是爲webapp提供默認屬性配置的文件,在tomcat啓動時會先加載webapp屬性的自定義配置文件/WEB-INF/web.xml,而後再加載此文件提供默認屬性,通常此文件都不用任何修改,要定義屬性時修改/WEB-INF/web.xml便可。對於此處的web.xml,惟一須要知道的是其內設置了主頁文件名。
1
2
3
4
5
6[root@xuexi tomcat]# grep -C 1 index conf/web.xml
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
安裝後,設置環境變量。
1
2
3echo "export CATALINA_HOME=/usr/local/tomcat" > /etc/profile.d/tomcat.sh echo 'export PATH=$CATALINA_HOME/bin:$PATH' >> /etc/profile.d/tomcat.sh . /etc/profile.d/tomcat.sh
執行bin目錄下的version.sh檢查PATH環境變量是否正確。
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@xuexi bin]# version.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/8.5.14 Server built: Apr 13 2017 12:55:45 UTC Server number: 8.5.14.0 OS Name: Linux OS Version: 2.6.32-504.el6.x86_64 Architecture: amd64 JVM Version: 1.8.0_131-b11 JVM Vendor: Oracle Corporation
最後啓動tomcat。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[root@xuexi tomcat]# catalina.sh start Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [root@xuexi tomcat]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1879/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1415/master tcp 0 0 :::22 :::* LISTEN 1879/sshd tcp 0 0 ::1:25 :::* LISTEN 1415/master tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 15212/java tcp 0 0 :::8009 :::* LISTEN 15212/java tcp 0 0 :::8080 :::* LISTEN 15212/java [root@xuexi tomcat]# curl -I http://localhost:8080 HTTP/1.1 200 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Tue, 17 Oct 2017 16:49:10 GMT