Tomcat(一):背景知識和安裝tomcat


Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


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開發(實際上現在還是如此,java程序員至少要懂簡單的html/css/javascript等前端技術),於是后來出現了JSP類庫。

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應用下。

考慮到tomcat和httpd、nginx等http服務程序的對比,有兩點需要明確:

(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。它們的組織結構大致如下:

<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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM