Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.htmljavascript
不管是何種程序,要能在計算機上運行,必須能轉換爲二進制的機器語言才能和硬件進行交互,在機器語言的上層是彙編語言,再上層是C/C++這樣較底層的語言,因爲它們嚴重依賴於平臺架構,全部通常只能運行在程序源代碼已編譯的機器上,可移植性比較差。css
Java是一種面向對象的語言,它的層次比C更高一點,層次指的是離硬件更遠一點。它將寫好的程序文件(.java)經過java編譯器javac編譯成字節碼類型的class文件(.class),在編譯過程當中涉及詞法分析、語法分析、語義分析、字節碼生成等過程,最終生成字節碼的class文件。class文件是Java的類文件,是編譯成功後的字節碼文件,字節碼由Java虛擬機JVM解釋執行,它將每一條字節碼送給解釋器,再翻譯成機器語言,從而在特定的機器上運行。Java經過JVM的方式實現了一次編譯處處運行的功能。html
即:前端
源碼XXX.java-->javac編譯器-->字節碼XXX.class-->JVM-->機器語言(依賴於不一樣平臺)-->執行
JRE(Java Runtime Environment)是包含了JVM和其餘一些簡單功能的JAVA運行環境,它適用於只運行java程序時。JDK(Java Development Kit)比JRE包含了更多東西,它除了能做爲JAVA運行環境,還提供了不少用於開發的工具,因此它適用於開發程序時使用。java
JAVA SE是java開發標準版,裏面有JDK,Java EE是企業版,本質上ee只是比se多提供了幾個類庫而已。linux
在web應用程序上,早期Java的實現方式是服務器端放置應用程序,客戶端訪問時將其下載到客戶端本地並執行,這樣不只不安全,並且要求客戶有java運行環境,這種實現方式是applet。nginx
與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代碼。web
JSP的本質仍是Servlet,每一個JSP頁面就是一個Servlet對象(固然也可能引用了其餘servlet對象),Servlet再負責響應用戶的動態請求數據(其實也包括靜態數據,由於jasper翻譯jsp代碼時,靜態標籤也被翻譯到servlet的java源文件中以待輸出)。對於Tomcat而言,JSP頁面生成的Servlet放在work路徑對應的Web應用下。shell
考慮到tomcat和httpd、nginx等http服務程序的對比,有兩點須要明確:
(1).一個java程序只有一個進程,可是能夠有多個線程,也就是說java程序的開發是基於線程的。那惟一的進程就是JVM進程,每一個應用程序都開啓一個JVM進程,根據開發時設計的多線程代碼,在這個JVM進程中會啓動多個線程。它不像httpd或nginx,能開啓多進程(對於tomcat而言,這意味着多個不一樣的應用程序甚至意味着開啓多個tomcat實例)。
(2).tomcat能夠處理動態請求,也能夠處理靜態資源請求。但不管是動態資源,仍是靜態資源的請求,都是通過servlet處理並響應給客戶端的,只不過請求靜態資源時使用的是默認的servlet。雖然它能像httpd和nginx同樣處理靜態資源,但顯然,它既要處理動態請求,又要處理靜態請求,壓力會很大。所以tomcat前通常使用httpd或nginx專門處理靜態請求,而動態請求則經過反向代理的方式代理至tomcat。
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都算是應用服務器。
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來講,它高度模塊化,經過各個組件實現各類功能。它的體系結構以下圖所示:
其中:
還有一些其餘組件,如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>
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爲例。
下載地址: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)
直接解壓便可。
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 start
。catalina.sh start
。catalina.sh stop
。catalina.sh configtest
。在安裝目錄下的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