tomcat創建虛擬主機

WEB瀏覽器與WEBserver創建鏈接後,除了將請求URL中的資源路徑發送給WEBserver外,還會將URL中的主機名部分做爲HTTP請求消息的Host頭髮送給WEBserver。好比,在瀏覽器地址欄中輸入http://www.it315.org,瀏覽器發送給www.it315.org主機上的WEBserver的請求消息內容例如如下:html

       GET  /  HTTP/1.1<回車>web

       Host:  www.it315.org<回車>瀏覽器

       <回車>安全

WEBserver接收到瀏覽器的訪問請求消息後,依據Host頭字段中所設置的主機名,就知道該選擇哪一個WEB網站來進行響應,所以,可以使用不一樣的主機名來做爲區分同一個WEBserver上的不一樣網站的標識信息。網絡

TomcatServer.xml配置文件裏有一個<Host>元素,一個<Host>元素用於創建一個WEB網站,使用多個<Host>元素則可以創建多個WEB網站。<Host>元素的父級的元素中爲<Engine>元素,嵌套在同一個<Engine>元素中的多個<Host>元素的name屬性不能一樣,<Host>元素的name屬性指定WEB網站所相應的主機名稱。TomcatServer.xml配置文件裏初始設置的<Host>元素內容例如如下:app

<Host name="localhost" appBase="webapps" …>webapp

網站

</Host>加密

<Host>元素中的appBase屬性指定了一個路徑,該路徑將做爲嵌套在它裏面的<Context>元素的docBase屬性中設置的相對路徑的基準路徑。spa

Tomcat接收到訪問請求時,將比較請求消息中的Host頭字段的值與<Host>元素的name屬性值,並以匹配的<Host>元素所建立的WEB網站來響應。假設Server.xml文件裏沒有與請求消息的Host頭字段匹配的<Host>元素,Tomcat將以默認的WEB網站來響應。僅僅要<Engine>元素的defaultHost屬性設置爲嵌套在它裏面的某個<Host>元素的name屬性值,該<Host>元素所建立的WEB網站就成了該引擎的默認WEB網站。好比,TomcatServer.xml文件裏的<Engine>元素的默認設置例如如下:

<Engine name="Standalone" defaultHost="localhost" debug="0">

       <Host name="localhost" appBase="webapps" …>

       

       </Host>

</Engine>

上面的這段配置信息說明,該引擎的默認WEB網站爲嵌套在<Engine>元素中的name屬性爲「localhost」的<Host>元素所建立的WEB網站。

在同一臺計算機上創建了多個基於主機名的虛擬主機後,WEB瀏覽器要訪問當中的某個虛擬主機的資源時,在訪問URL中必須採用主機名,而不能採用IP地址。這是因爲WEB瀏覽器要將URL中的主機名部分做爲HTTP請求消息的Host頭髮送給WEBserver,假設URL中的主機名部分使用的是IP地址,那麼,瀏覽器發出的請求消息中的Host頭字段的值就是這個IP地址,而在同一臺計算機上創建的多個基於主機名的虛擬主機共享同一個IP地址,在Host頭字段使用IP地址根本就沒法區分不一樣的網站。

即便在URL中指定的是主機名時,WEB瀏覽器仍是要先得到該主機名所相應的IP地址,而後再使用這個IP去鏈接WEBserver。因此,在創建基於主機名的虛擬主機時,除了要在Tomcatserver.xml文件裏進行設置外,還需要在整個網絡系統中創建主機名與IP地址的映射關係,即必須將主機名加入到名稱解析系統,以便WEB瀏覽器能夠從名稱解析系統中查詢出主機名所相應的IP地址。創建主機名與IP地址的映射關係的慣用方式有兩種:一是使用客戶機本地的Hosts 文件,二是使用DNS(Domain Name System,域名系統)server。Hosts 文件和DNS的做用都是贊成用戶使用「友好」的、文本格式的主機名稱,而不是數字格式的IP地址來訪問網絡中的計算機。Hosts文件可用於小型的Intranet(企業內部網),網絡中的所有計算機上都需要使用Hosts文件。DNS通常常使用於大型的網絡,特別是Internet上對外提供服務的計算機都是經過DNS來創建其主機名與IP地址的映射關係。客戶機首先在本地的Hosts文件裏查找主機名稱所映射的IP地址,假設沒有找到,再去查詢DNSserver。爲了簡單起見,這裏僅介紹一下Hosts文件。對於Windows 2000系統,Hosts 文件位於操做系統根文件夾(取決操做系統所在的分區,通常是c:/winnt)下的System32/Drivers/Etc子文件夾中,默認狀況下,該文件裏有例如如下一行內容:

       127.0.0.1       localhost

這行文本的做用就是將IP地址(127.0.0.1)映射成主機名(localhost),這也就是在IE瀏覽器地址欄中可以使用localhost訪問本地WEBserver的緣由。假設要添加不少其它的主機名與IP地址的映射,可以在Hosts文件裏添加不少其它的行,而後參照上面這行內容的格式在每行中填寫IP地址和對應的主機名。

(1)用UltraEdit打開<Tomcat 主文件夾>/conf文件夾下的Server.xml文件,使用「查找」菜單查找內容爲「</Host>」的行,緊接該行如下添加一對 <Host></Host>標籤。參照前面的<Host>標籤的屬性設置狀況,設置新增的<Host> 標籤的屬性,並在它裏面嵌套一個設置該WEB網站根文件夾的<Context>元素,終於的內容例如如下:
        <Host name="site1" debug="0" appBase="d:/VirtualHost1">
               <Context path="" docBase="." debug="0"/>
        </Host>
這樣,將建立一個新的WEB網站。上面的<Context>元素的docBase屬性值被設置爲一個點(.),即表示使用<Host>元素的appBase屬性中所設置的路徑做爲這個<Context>所映射的文件夾。
(2)在上面新增的<Host></Host>標籤對如下再添加一對<Host></Host>標籤,並將它設置爲例如如下形式:
        <Host name="site2" debug="0" appBase="d:/VirtualHost2">
               <Context path="" docBase="." debug="0"/>
        </Host>
這又建立了一個新的WEB網站,該網站的主機名稱爲site2,根文件夾相應的本地文件系統文件夾爲d:/VirtualHost2。
(3)在d:盤下建立名稱爲VirtualHost1和VirtualHost2兩個文件夾,並在這兩個文件夾中分別建立一個名爲test.html的文件,在d:/VirtualHost1/test.html文件裏寫入例如如下一行內容:
    這是d:/VirtualHost1文件夾中的test.html文件
在d:/VirtualHost2/test.html文件裏寫入例如如下一行內容:
    這是d:/VirtualHost2文件夾中的test.html文件
(4)保存改動後的Server.xml文件,又一次啓動Tomcat WEBserver程序。打開一個新的命令行窗體中,並在這個命令行窗體中運行例如如下命令:
telnet 127.0.0.1 8080
接着在鏈接成功的telnet程序命令窗體中,輸入例如如下內容:
        GET /test.html HTTP/1.1<回車>
        Host:<空格>site1<回車>
        <回車>
這時在telnet程序窗體中可以看到,WEBserver返回內容的正文部分爲d:/VirtualHost1/test.html文件裏的內容。接着WEBserver返回內容的下邊,輸入例如如下內容:
        GET /test.html HTTP/1.1<回車>
        Host:<空格>site2<回車>
        <回車>
在telnet程序窗體中又可以看到,WEBserver此次返回內容的正文部分爲d:/VirtualHost2/test.html文件裏的內容。接着WEBserver返回內容的下邊,輸入例如如下內容:
        GET /test.html HTTP/1.1<回車>
        Host:<空格><回車>
        <回車>
在telnet程序窗體中又可以看到,WEBserver此次返回內容的正文部分爲d:/test/test.html文件裏的內容。接着WEBserver返回內容的下邊,再次輸入例如如下內容:
        GET /test.html HTTP/1.1<回車>
        Host:<空格>xxx<回車>
        <回車>
在telnet程序窗體中又可以看到,WEBserver此次返回內容的正文部分仍然爲d:/test/test.html文件裏的內容。
上面的整個交互過程如圖2.34所看到的,Tomcat根 據第1次和第2次請求中所指定Host頭的值,查找Server.xml文件裏與之相匹配的<Host>元素的name屬性值,並以匹配的 <Host>元素所設置的WEB網站來響應;在第3次和第4次請求中所指定Host頭的值,在Server.xml文件裏沒有與之相應的 <Host>元素的name屬性值,Tomcat將以默認的WEB網站來響應。
圖2.34
(5)在Windows 2000系統中,用記事本程序打開c:/winnt/System32/Drivers/Etc/Hosts文件,可以看到有例如如下一行內容:
        127.0.0.1        localhost
緊接這行文本的如下,用它複製出兩行文本,並將這兩行文本中的localhost分別改動成site1和 site2,這樣,就使用Hosts文件爲當前計算機設置了多個主機名。假設要用site1和site2這個兩主機名訪問其它計算機上的WEB網站,則應 將127.0.0.1改動成其它計算機的實際IP地址。保存Hosts文件後,在命令行窗體中運行「ping site1和「ping site2命令,查看該主機名是否被正確解析到了對應的IP地 址上。創建site1和site2與計算機IP地址的映射後,在IE瀏覽器地址欄中輸入http://localhost: 8080/test.html、http://site1:8080/test.html和http://site2:8080/test.html,可 以看到瀏覽器將顯示出各自網站中的test.html網頁文件的內容。
可見,使用主機名的方式在同一臺WEBserver上建立多 個虛擬主機後,在WEB瀏覽器中使用主機名訪問Webserver時,Webserver將選擇與該主機名關聯的WEB網站進行響應。經過這樣的方式,多個WEB網站可 以共享同一個IP地址和一樣的port號,惟一不足的就是WEB瀏覽不能經過IP地址去訪問這些WEB網站。基於主機名的虛擬主機是眼下Internet上的 大多數虛擬主機業務提供商所一般採用的方式。僅僅要找出幾個小型公司或我的的網站,假設在WEB瀏覽器地址欄中輸入「http://主機名」可以訪問到該 WEB網站,接着在命令行窗體中運行「ping 主機名」,查看到該域名相應的IP地址,而後在WEB瀏覽器地址欄中輸入「http://IP地址」時,卻沒法訪問這個WEB網站了,那麼,這個WEB站 點就是一個基於主機名的虛擬主機,它與其它一些WEB網站共享一臺WEBserver,而不是本身獨享一臺WEBserver。
注意:當使用安全套接字層 (SSL) 時,不能使用主機頭字段來實現虛擬主機,這是因爲使用SSL的HTTP請求有加密保護。主機頭字段是加密內容的一部分,不能被解釋和路由到正確的網站。
相關文章
相關標籤/搜索