本文目錄:1. 背景知識 1.1 java和jdk概念 1.2 jsp、servlet是什麼 1.3 web伺服器、web容器、應用程式伺服器 1.4 tomcat體繫結構2. 安裝tomcat 2.1 安裝jdk 2.2 安裝tomcat 1. 基礎背景知識 1.1 java和jdk概念 無論是何 ...
本文目錄:
1. 背景知識
1.1 java和jdk概念
1.2 jsp、servlet是什麼
1.3 web伺服器、web容器、應用程式伺服器
1.4 tomcat體繫結構
2. 安裝tomcat
2.1 安裝jdk
2.2 安裝tomcat
1. 基礎背景知識
1.1 java和jdk概念
無論是何種程式,要能在電腦上運行,必須能轉換為二進位的機器語言才能和硬體進行交互,在機器語言的上層是彙編語言,再上層是C/C++這樣較底層的語言,由於它們嚴重依賴於平臺架構,所有一般只能運行在程式源代碼已編譯的機器上,可移植性比較差。
Java是一種面向對象的語言,它的層次比C更高一點,層次指的是離硬體更遠一點。它將寫好的程式文件(.java)通過java編譯器javac編譯成位元組碼類型的class文件(.class),在編譯過程中涉及詞法分析、語法分析、語義分析、位元組碼生成等過程,最終生成位元組碼的class文件。class文件是Java的類文件,是編譯成功後的位元組碼文件,位元組碼由Java虛擬機JVM解釋執行,它將每一條位元組碼送給解釋器,再翻譯成機器語言,從而在特定的機器上運行。Java通過JVM的方式實現了一次編譯到處運行的功能。
即:
源碼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多提供了幾個類庫而已。
1.2 jsp、servlet是什麼
在web應用程式上,早期Java的實現方式是伺服器端放置應用程式,客戶端訪問時將其下載到客戶端本地並執行,這樣不僅不安全,而且要求客戶有java運行環境,這種實現方式是applet。
與applet相對的是servlet,但它是服務端程式。後來,java將應用程式放在伺服器端,客戶端請求此應用程式時,服務端通過servlet類庫分析http協議,將請求的應用程式在服務端執行,然後將結果組織起來返回給客戶端,但此時servlet能分析的http協議非常簡單,且和html的組織方式非常不友好,它要求java程式員首先得懂html開發,於是後來出現了JSP類庫。
JSP可以簡單的將java代碼嵌入在html文檔中,它們能夠很友好地結合,結合後的文檔類型為.jsp文件。當客戶端請求應用程式資源時,JSP類庫負責解析.jsp文件中的jsp部分並通過jasper組件將其翻譯成servlet代碼,然後再交由servlet來編譯並交給JVM來執行。實際上,jsp和servlet本質上是一樣的,jsp類只不過是繼承於servlet類並添加了一些和html友好結合的特性,最終它還是要翻譯成servlet代碼。
事實上,JSP是Servlet的一種特殊形式,每個JSP頁面就是一個Servlet實例,Servlet再負責響應用戶請求。JSP其實也是Servlet的一種簡化,使用JSP時,其實還是使用Servlet,因為Web應用中的每個JSP頁面都會由Servlet容器生成對應的Servlet。對於Tomcat而言,JSP頁面生成的Servlet放在work路徑對應的Web應用下。
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。它們的組織結構大致如下:
<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個文件,其中兩個是版本號的軟鏈接。
shell> 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進程數)。
shell> 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工具是否安裝成功。
[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環境變數。
shell> 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
直接解壓即可。
shell> 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
安裝完後,有以下幾個文件和目錄。
shell> 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腳本。
[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格式的配置文件。
[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,唯一需要知道的是其內設置了主頁文件名。
[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>
安裝後,設置環境變數。
echo "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環境變數是否正確。
[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。
[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