一、Web應用的相關知識
- HTTP協議
Web瀏覽器與Web服務器的交互過程得遵循一定的規則,這個規則就是HTTP協議。 - URL
放置在Internet上的Web服務器中的每一個網頁文件都應該有一個訪問標記符,
用於唯一地標識它的訪問位置,以便Web瀏覽器能夠定位到它。這個訪問標識符稱爲URL,
即Uniform Resource Locator的英文簡寫,翻譯成中文就是統一資源定位符。
URL地址中包含Web服務器主機或IP地址、文件(或其他資源)路徑名稱,以及使用的網絡協議和端口號。 - 主要的Web服務器軟件
目前主要的兩種Web服務器軟件是Microsoft Internet Information Server(簡稱IIS)和Apache。
要想在這些Web服務器軟件中運行Servlet和JSP,還必須將它們與某種Servlet和JSP容器(引擎)進行集成。
Tomcat是Sun公司推薦的運行Servlet和JSP的容器,它可以被集成到IIS和Apache中。另外,Tomcat
也具有Web服務器的一些基本功能,對於一般的應用情況,也可以直接將Tomcat作爲Web服務器軟件運行。 - 網站系統的組成
二、安裝Tomcat
- Tomcat簡介
Tomcat是Apache組織的Jakarta項目中的一個核心項目,它是Sun公司推薦的
運行Servlet和JSP的容器(引擎),其源代碼是公開的。
Tomcat還具有Web服務器的基本功能,提供數據庫連接池、SSL、Proxy等許多通用組件功能。
Tomcat也可以作爲獨立的Web服務器軟件運行,但它處理靜態HTML文件的速度比不上Apache和IIS
等專業的Web服務器,且其作爲Web服務器軟件的功能也不如Apache和IIS強大。
可以將Tomcat與Apache或IIS集成起來,讓Apache或IIS處理靜態HTML文件,
Tomcat則專門用於處理Servlet與JSP等編寫的“動態網頁”。 - 獲取Tomcat安裝程序包
下載地址:https://tomcat.apache.org - 使用zip和tar.gz包安裝Tomcat
解壓;
主要子目錄的介紹:
bin 用於放置Tomcat的可執行文件和腳本執行文件。
conf 用於放置Tomcat的配置文件。
logs 用於放置Tomcat的日誌記錄文件。
webapps Web應用程序的主要發佈目錄。
work Tomcat的工作目錄,JSP文件翻譯成的Servlet源文件和class文件放置在這裏。 - 使用exe程序安裝Tomcat
在安裝Tomcat之前,必須安裝JDK。
使用exe程序進行安裝可增加一些啓動和管理Tomcat的快捷方式,
以及幫助用戶修改Tomcat管理員賬戶和網絡監聽端口的默認設置。
選擇“NT Service”項,Tomcat將作爲NT服務程序安裝;
選擇“JSP Development Shell Extensions”項,
以.jsp爲擴展名的文件將被關聯成雙擊時用Windows記事本程序打開;
選擇“Tomcat Start Menu Group”項,在Windows程序菜單中添加啓動和管理Tomcat的一些快捷菜單。
三、Tomcat的啓動與停止
- 使用Tomcat服務程序
啓動與停止
在Tomcat的服務菜單中,單擊“啓動”按鈕和單擊“停止”按鈕。
修改Tomcat服務程序的啓動類型
設置爲主動時,每次啓動Windows後,該服務程序自動啓動運行;設置爲手動時,
需要單擊“啓動”按鈕啓動。
命令行啓動和停止
啓動:net start 服務名稱,停止:net stop 服務名稱。
IP和端口
正確安裝TCP/IP協議後,計算機本地迴路IP地址是127.0.0.1,操作系統將localhost映射成127.0.0.1
Tomcat的Web服務監聽端口爲8080。
查看Tomcat服務程序啓動運行後的效果
http://localhost:8080
查找網絡服務程序監聽異常的問題
執行netstat-na命令,查看TCP監聽端口列表中是否包含Tomcat的Web服務綁定的監聽端口。
使用一個名爲Fport的工具軟件,可以查看到本地計算機上所有打開的TCP和UDP端口,
以及使用這些端口的應用程序名稱。 - startup.bat批處理文件
批處理文件
用於批量執行多條Windows命令的文本文件稱爲Windows命令腳本文件或批處理文件。
startup.bat
01 @echo off
用於讓其後的所有命令在執行時都不在命令行窗口中顯示命令自身的文本內容。如果在
某個命令的最前面加上@,這個命令執行時將不在命令行窗口中顯示其自身的文本內容。
02 if "%OS%" == "Windows_NT" setlocal
if三種語法格式之一:if "參數或環境變量" == "字符串" 命令
條件成立,語句中的命令執行後再繼續往下執行,否則就不執行語句中的命令而直接往下執行。
03 rem Guess CATALINA_HOME if not defined
rem後表示註釋
04 if not "%CATALINA_HOME%" == "" goto gotHome
goto命令用於讓批處理跳轉到它後面指定的標號處開始往下執行。標號在一個單獨的行中定義,
格式爲標號名稱前面加上一個冒號(:),如08行所示,標號所在行不被執行。
05 set CATALINA_HOME=.
設置環境變量
06 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
if另外一種格式:if exist 文件名 命令
07 set CATALINA_HOME=..
08 :gotHome
設置標號
09 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
10 echo The CATALINA_HOME environment variable is not defined
echo命令用於在命令行窗口中顯示一行文本
11 goto end
12 :okHome
13 set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
14 set CMD_LINE_ARGS=
清空環境變量
15 :setArgs
16 if ""%1""=="""" goto doneSetArgs
在執行批處理文件時,可以在批處理文件名後面追加若干用空格分隔的文本字符串。這些
文本字符串就是傳遞給批處理文件的參數,每個用空格分開的文本字符串分別代表一個參數。
批處理文件中可以使用%0到%9這樣的10個變量名,其中,%0的值爲正在執行的批處理文件名,
%1到%9依次爲傳遞給這個批處理文件的前9個參數。
17 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
18 shift
shift命令用於將傳遞給批處理文件的參數依次向前移位。
19 goto setArgs
20 :doneSetArgs
21 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
call命令用於調用另一個批處理文件,另外那個批處理文件執行完後
回到當前批處理文件中接着執行call後面的命令行。
22 :end - catalina.bat批處理文件
catalina.bat
26 set _EXECJAVA=start "Tomcat" %_RUNJAVA%
如果當前操作系統的OS環境屬性爲Windows_NT,那麼執行將新啓動的命令行窗口標題設置爲Tomcat。
34 :ececCmd
35 xxx
最簡形式:%_EXECJAVA% %MAINCLASS% %ACTION%
java org.apache.catalina.startup.Bootstrap start - 使用批處理程序及查找Tomcat的啓動問題
Windows啓動和結束Tomcat
只要在setclasspath.bat批處理文件第一次使用JAVA_HOME環境變量之前的任何地方,
例如在Windows系統特性的“環境變量”對話框中,或者在startup.bat、catalina.bat、
setclasspath.bat等任意一個文件的開始位置處,將JAVA_HOME環境變量設置爲
JDK的安裝主目錄,就可以使用strat.bat文件啓動Tomcat了。
可以使用shutdown.bat文件或“Stop Tomcat”快捷菜單項、
或者命令行窗口中按下Ctrl+C鍵結束Tomcat。
Linux啓動和結束Tomcat
Linux下的Tomcat啓動腳本文件爲startup.sh,關閉腳本文件爲shutdown.sh。
讓startup批處理的內部不要產生新的命令行窗口
將catalina.bat文件中的第26行裏的位於%_RUNJAVA%前面的start “Tomcat”部分刪除,
或者將29行裏位於%_RUNJAVA%前面的start部分刪除。
四、配置Web站點的虛擬目錄
- 虛擬目錄
一個Web資源的URL中的資源路徑部分,例如/training/index.html,
就是由Web服務器的某個本地目錄中的資源所映射成的虛擬路徑。
/training/index.html中的第一個正斜槓“/”表示站點的根目錄,
/training/表示站點根目錄下面的一個名爲training的子目錄,
/training/index.html表示“training”子目錄中的一個名爲index.html的文件。
將Web服務器的本地文件系統中的某個目錄映射成一個虛擬Web目錄過程叫Web發佈。 - 虛擬Web目錄的映射原理
一個Web站點上必須有且只能有一個虛擬根目錄,其他虛擬目錄都以根目錄的子孫目錄形式出現,
根目錄用正斜槓“/”表示,根目錄與該目錄下的子目錄或資源文件也用正斜槓“/”進行分割。
一個Web站點除了可以設置一個虛擬根目錄外,還可以爲其設置若干個虛擬子目錄。
一個文件系統目錄可以被映射成一個或多個虛擬Web目錄,
但一個虛擬Web目錄只能對應一個本地文件系統目錄。
當瀏覽器請求某個路徑的資源時,Tomcat按照最長路徑匹配原則進行處理。 - 設置Web站點的根目錄
1、<Tomcat主目錄>/webapps/ROOT目錄可以自動映射成爲Web站點的虛擬根目錄,
Tomcat初始安裝後的虛擬根目錄裏就是以這種方式創建的,注意目錄名ROOT中的每個字母都是大寫的。
2、<Tomcat主目錄>/conf/server.xml文件中的一個<Context>:
<Context path="" docBase="ROOT" debug="0"/>
元素用於將本地文件系統中的一個目錄映射成一個可供Web瀏覽器訪問的虛擬Web目錄。
其中,path屬性指定虛擬Web目錄的路徑,當其設置爲空字符串時,
則表示的是整個Web站點的根目錄;docBase屬性指定該虛擬Web目錄所映射到的本地文件系統目錄,
可以使用絕對路徑或相對<Tomcat主目錄>/webapps的相對目錄。 - 設置Web站點的虛擬子目錄
1、基本方式
在Tomcat中設置虛擬子目錄的最基本的方式就是在<Tomcat主目錄>/conf/server.xml文件中設置<Context>
元素,<Context>元素必須嵌套在<Host>元素之中,一個<Host>元素表示一個Web站點,
其中可以包含多個<Context>子元素,每個<Context>子元素分別對應該站點下的一個虛擬Web目錄。
只有<Tomcat主目錄>/webapps目錄下的子目錄中包含WEB-INF子目錄。更確切的說,
在包含WEB-INF/web.xml文件時,該子目錄會被自動設置成一個Web應用程序,
其虛擬路徑就是在該子目錄的名稱前加上“/”。
放入<Tomcat主目錄>/webapps目錄下的war文件將被自動設置成一個Web應用程序,
其虛擬路徑就是該war文件名稱的前面加上“/”。在這種情況下,
war文件對應的目錄中可以不包含WEB-INF子目錄和WEB-INF/web.xml文件。 - 部署描述符與目錄的默認網頁
web.xml文件用於描述Web應用程序的部署信息,因此web.xml文件也稱爲應用程序的部署描述符。
在<Tomcat主目錄>/conf目錄中也提供了一個web.xml文件,該文件中的設置信息對所有的Web應用程序
都起作用。<Tomcat主目錄>/conf/web.xml文件裏面的設置信息也就是每個Web應用程序的默認設置。
每個Web應用程序內部的web.xml文件用於在<Tomcat主目錄>/conf/web.xml文件的設置基礎上增加
或覆蓋一些設置信息,一個Web應用程序內部的web.xml中所設置的信息只對該web應用程序自己有效。
如果客戶端訪問的URL指向的是一個目錄名,而不是文件名,Tomcat有可能返回目錄下的內容列表,
也可能返回該目錄下的一個默認網頁文件。
<webcome-file-list>元素用於設置Web目錄的默認網頁文檔列表,其中可以嵌套多個<welcome-file>子元素,
每個<welcome-file>子元素中指定一個網頁文件。
當瀏覽器訪問指向目錄的URL地址時,Tomcat按照<welcome-file-list>元素指定的默認網頁文檔的順序,
依次在該目錄中查找這些默認網頁文檔,將最先找到的默認網頁回傳給Web瀏覽器,並停止查找後面的
默認網頁文件。如果<welcome-file-list>元素指定的所有默認網頁文檔在瀏覽器訪問的目錄中都不存在,
Tomcat將該目錄中的文件和子目錄的超鏈接列表傳送給Web瀏覽器。
五、配置虛擬主機
- 瀏覽器訪問Web資源的過程
瀏覽器訪問過程
瀏覽器訪問一個Web資源時,根據URL中的協議名、IP地址(或主機名)、端口號等信息
與Web服務器建立網絡連接。Web瀏覽器與Web服務器建立連接後,通過這個連接URL後半部分的
資源路徑發送給Web服務器,請求服務器返回這個路徑名所指定的資源。
Telnet程序訪問Web資源的過程
啓動Tomcat Web服務器程序,然後打開一個新的命令行窗口,並在命令行窗口中執行如下命令:
telnet 127.0.0.1 8080
在Telnet程序啓動的命令行窗口中,輸入如下內容:
GET /test.html HTTP/1.1
打開Telnet程序的本地回顯功能 - 虛擬主機及實現原理
虛擬主機
在一臺計算機上可以使用Tomcat創建多個Web站點,一臺Web服務器,對外提供各自的Web服務
而互不影響,這就是稱之爲虛擬主機的解決方案。
實現原理
在一臺Web服務器上,可以使用不同的端口號、IP地址或主機名,以及這三個要素的不同組合
來創建多個Web站點。根據Web瀏覽器建立連接和發出請求消息時所指定的這三部分信息,
Web服務器就能夠確定Web瀏覽器要訪問的到底是這臺Web服務器上的哪個站點。 - 基於主機名的虛擬主機
虛擬主機
<Engine name="Standalone" defaultHost="localhost" debug="0">
...
<Host name="localhost" appBase="webapps"...>
...
</Host>
...
</Engine>
一個<Engine>元素構建一個處理客戶端請求的引擎,它接受Tomcat的連接器傳遞來的訪問請求,
進行具體的處理後將結果返回連接器。<Engine>元素的defaultHost屬性設置爲嵌套在它裏面的
某個<Host>元素的name屬性值,該<Host>元素所創建的Web站點就成該引擎的默認Web站點。
在一個<Engine>元素中可以使用多個<Host>元素來建立多個Web站點。
<Host>元素的name屬性用於指定其所對應的Web站點的主機名稱,嵌套在同一個<Engine>元素中的
多個<Host>元素的name屬性不能相同。appBase屬性指定一個路徑,該路徑將作爲嵌套在它裏面的
<Context>元素的docBase屬性中設置的相對路徑的基準路徑。
訪問過程
當Tomcat的連接器將接受到的訪問請求交給關聯的處理引擎時,處理引擎將比較請求消息中的Host頭字段的值
與相應的<Engine>元素中的所有<Host>元素的name屬性值,並選擇匹配的<Host>元素
所對應的Web站點下的內容來進行響應。如果相應的<Engine>元素中沒有與
請求消息的Host頭字段匹配的<Host>元素,處理引擎將選擇默認的Web站點來進行響應。
訪問URL中必須採用主機名
在同一臺計算機上建立多個基於主機名的虛擬主機後,Web瀏覽器要訪問其中的某個虛擬主機的資源時,
在訪問URL中必須採用主機名,而不能採用IP地址。
建立主機名與IP地址的映射關係
建立主機名與IP地址的映射關係的慣用方式有兩種,一是使用客戶機本地的Hosts文件,
二是使用DNS(Domain Name System,域名系統)服務器。
客戶機首先在本地的Hosts文件中查找主機名稱所映射的IP地址,如果沒有找到,再去查詢DNS服務器。 - 基於端口號的虛擬主機
一個<Connector>元素對應的連接器必須有一個相關的<Engine>元素去處理它所接受到的訪問請求,將一個
或多個<Connector>元素與某個<Engine>元素相關聯的方式就是將他們嵌套在同一個<Service>元素中。
要想使用Tomcat建立基於端口號的多個虛擬主機,需要在server.xml文件中創建多個<Service>元素,
並且每個<Service>元素中的<Connector>元素的port屬性的值不同。 - 基於IP地址的虛擬主機
在同一臺計算機上可以使用多個IP地址來維護多個Web站點。
建立基於IP地址的虛擬主機的意義不大,所以Tomcat沒有提供建立基於IP地址的虛擬主機方式。
六、與專用Web服務器的集成
- 集成的考慮因素
1、集羣
讓專業Web服務器作爲多個提供相同內容的Tomcat服務器的前端系統,客戶端的訪問請求先交給專業的
Web服務器,專業Web服務器再將訪問請求均衡地分配給這些Tomcat服務器去處理。
2、集羣/安全
每個Tomcat服務器位於專業Web服務器的後端,它們位於被保護的區域內,用戶不能夠直接訪問它們,
系統管理人員只需要考慮Web服務器的安全。
3、安全
專業Web服務器對於安全有更多的考慮和處理技巧。
4、附加功能
Tomcat中要集成CGI、Perl、PHP這些功能非常麻煩。
5、特殊功能
專業Web服務器能夠執行很多Tomcat不支持或者現在還不能很好支持的特殊功能。
6、速度
在某些場合下,Tomcat甚至比專業Web服務器更快。
7、Socket處理/系統穩定性
專業Web服務器在應對某些情況,比基於JVM的程序做得要好得多。 - 集成技術的選擇
JK集成Tomcat與其他Web服務器的技術,與Tomcat服務器之間採用AJP協議通訊,在實際應用中非常穩定。 - JK插件
假定在爲JK插件預先配置好的URL映射信息中,所有的“/*.jsp”形式的URL都由Tomcat服務器來處理,
那麼,當用戶請求訪問“/index.jsp”時,Web服務器將調用JK插件來處理,JK插件又把這個請求
轉發給Tomcat服務器處理,Tomcat服務器最後將響應結果經JK插件傳給Web服務器。
下載 - Tomcat體系結構與JK插件的工作原理
一個<Engine>元素可以與多個<Connector>元素相關聯,也就是多個連接器可以共用一個處理引擎。每個
連接器接受到不同協議和格式的訪問請求後,將它們轉換成統一的格式後再交給與它們關聯的引擎去處理。
要想讓JK插件正常工作,需要解決如下一些問題:
1、在Web服務器中正確安裝JK插件。
2、JK插件需要知道把請求轉發給哪個Tomcat服務器上的哪個連接器,
也就是需要知道該連接器的通訊協議和地址。
3、JK插件需要知道它負責處理的URL,以便通知Web服務器把這些URL轉交給它處理;另外,
一個JK插件可以向多個Tomcat服務器轉發請求,它需要知道哪些URL應轉發給哪個Tomcat服務器。
4、JK本身的一些配置信息,例如,記錄日誌的文件路徑、記錄日誌的級別等信息,如果第2和第3個問題
都在各自的一個屬性文件中進行設置,那麼,還需要告訴這兩個屬性文件的位置路徑。
在workers.properties文件中設置了與JK插件進行連接的每個Tomcat實例的屬性。
每個Tomcat實例的屬性由“.”符號分隔成三部分組成。
第一部分固定爲“worker”;
第二部分是爲要連接的一個Tomcat實例的名稱;
第三部分就是具體的屬性名稱。
每個真實的Tomcat實例至少需要設置下面的三個屬性:
type,指定Tomcat實例中負責與JK相連的那個連接器所使用的協議類型。
host,指定Tomcat實例的主機名或IP地址。
port,指定Tomcat實例中負責與JK相連的那個連接器所監聽的端口。
在workers.properties文件中,還需要設置worker.list屬性來指定JK插件所要連接的Tomcat實例的名稱,
如果JK要連接多個Tomcat實例,每個Tomcat實例的名稱之間使用逗號分隔。
在workers.properties文件中還可以將某個Tomcat實例的type屬性設置爲lb,表示這個Tomcat實例並不指向
真正的Tomcat服務器,而是代表一個實現負載均衡的系統,代表負載均衡系統的Tomcat實例是一種虛擬的
Tomcat實例,它沒有host和port屬性,而是需要設置一個balance_workers屬性。balance_workers屬性中
列出了組成該負載均衡系統的所有其他真實的Tomcat實例的名稱。參與了一個負載均衡系統的
每個Tomcat實例的名稱不能出現在work.list屬性中。
在uriworkermap.properties文件中設置Web服務器需要轉發給Tomcat服務器去處理的URL,
以及處理每個URL的Tomcat實例名稱。其中,每行等號左邊的內容表示要轉發給
Tomcat服務器處理的URL,可以使用“*”通配符來匹配一組URL,等號右邊是處理
該組URL的Tomcat實例的名稱,該名稱必須是在worker.properties文件中定義的名稱。 - Tomcat與IIS服務器集成
1、下載並安裝JK插件
下載
在IIS安裝JK插件,就是要把JK插件安裝爲一個ISAPI篩選器。
還必須將JK插件所在的目錄設置爲某個站點下的一個具有執行許可權限的虛擬目錄。
2、編寫workers.properties和uriworkermap.properties文件
提示:Tomcat與IIS可以位於不同的計算機上,並且一個IIS服務器可以與多個不同計算機上的
Tomcat服務器進行集成,JK插件相關的配置文件都應該放置在IIS服務器所在的計算機上,
而不用放置在任何Tomcat服務器上。
3、設置JK插件的屬性
isapi_redirect.properties設置workers.properties和uriworkermap.properties文件的路徑屬性。
4、測試配置是否成功 - Tomcat與Windows系統下的Apache服務器集成
1、下載並安裝Apache服務器
下載
安裝
啓動
2、下載並安裝JK插件
將下載的供Apache服務器使用的JK插件文件改名爲mod_jk.so後,複製到<APACHE_HOME>\modules
目錄中,然後在Apache的httpd.conf配置文件中增加一條loadMoudle指令即可。
3、設置配置信息
httpd.conf
#加載JK插件模塊
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服務器的信息
JkWorkerPropertity worker.list=worker1
JkWorkerPropertity worker.worker1.port=8009
JkWorkerPropertity worker.worker1.host=localhost
JkWorkerPropertity worker.worker1.type=ajp13
#指定生成JK插件的日誌文件的目錄
JkLogFile logs/mod_jk.log
#指定JK插件的日誌文件的級別
JkLogLevel debug
#設置JK插件的路徑映射信息
JkMount /*.jsp worker1
JkMount /myweb/* worker1
如果Tomcat服務器的配置信息和JK插件的URL路徑映射信息比較複雜,
也可以將它們分別放在workers.properties和uriworkermap.properties文件中編寫,
然後在httpd.conf文件中使用兩條指令來說明這兩個文件的位置路徑。
workers.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
uriworkermap.properties
/*.jsp=worker1
/myweb/*=worker1
httpd.confg
#加載JK插件模塊
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服務器的信息
JkWorkersFile conf/workers.properties
#指定生成JK插件的日誌文件的目錄
JkLogFile logs/mod_jk.log
#指定JK插件的日誌文件的級別
JkLogLevel debug
#設置JK插件的路徑映射信息
JkMountFile conf/uriworkermap.properties
4、測試配置是否成功