1、網站系統的組成 只要在一臺計算機上安裝了WEB服務器軟件,從功能上講,這臺計算機就能夠稱爲WEB服務器。一個網站的規模可大可小,功能可多可少,最簡單的網站只須要一臺Web服務器便可對外提供網頁瀏覽服務。複雜的網站包括多臺WEB服務器組成的羣集系統、負載均衡設備、具備緩存功能的代理服務器(能夠有多級,甚至包括放置在服務器端的緩存系統)、數據庫系統等,如圖2.2所示。
html
圖2.2web
www.sina.com網站系統採用的基本上就是圖2.2所示的架構,不一樣地區的人們在訪問www.sina.com站點時,瀏覽器實際上所訪問的服務器是不同的,例如,吉林省的用戶訪問的服務器實際是sina放在吉林地區的代理服務器,湖北省的用戶訪問的服務器實際是sina放在湖北地區的代理服務器。各地區的瀏覽器訪問www.sina.com站點的過程如圖2.3所示。
數據庫
圖2.3瀏覽器
爲了可以讓瀏覽器透明地訪問到WEB站點,讓用戶感受不到是在訪問區域代理服務器,在DNS系統中須要將www.sina.com主機名指向全部的區域代理服務器的IP地址。在瀏覽器訪問www.sina.com站點中的頁面而向DNS服務器請求解析www.sina.com主機名時,DNS服務器根據訪問者的地理位置信息返回他附近的區域代理服務器的IP地址,這樣,瀏覽器的訪問請求將發送給該區域代理服務器。只有當區域代理服務器中沒有瀏覽器要訪問的頁面時,區域代理服務器纔去從真正的www.sina.com站點服務器上獲取該頁面並進行緩存,之後該區域的其餘瀏覽器就均可以就近從區域代理服務器中訪問到該頁面了,從而大大提升了訪問效率和減小了網絡流量。
WEB瀏覽器與WEB服務器創建鏈接後,除了將請求URL中的資源路徑發送給WEB服務器外,還會將URL中的主機名部分做爲HTTP請求消息的Host頭髮送給WEB服務器。例如,在瀏覽器地址欄中輸入http://www.it315.org,瀏覽器發送給www.it315.org主機上的WEB服務器的請求消息內容以下:
GET / HTTP/1.1<回車>
Host: www.123it.com<回車>
<回車>
WEB服務器接收到瀏覽器的訪問請求消息後,根據Host頭字段中所設置的主機名,就知道該選擇哪一個WEB站點來進行響應,所以,可使用不一樣的主機名來做爲區分同一個WEB服務器上的不一樣站點的標識信息。
Tomcat的Server.xml配置文件中有一個<Host>元素,一個<Host>元素用於創建一個WEB站點,使用多個<Host>元素則能夠創建多個WEB站點。<Host>元素的父級元素爲<Engine>元素,嵌套在同一個<Engine>元素中的多個<Host>元素的name屬性不能相同,<Host>元素的name屬性指定WEB站點所對應的主機名稱。Tomcat的Server.xml配置文件中初始設置的<Host>元素內容以下:
<Host appBase="webapps" …>
…
</Host>
<Host>元素中的appBase屬性指定了一個路徑,該路徑將做爲嵌套在它裏面的<Context>元素的docBase屬性中設置的相對路徑的基準路徑。
當Tomcat接收到訪問請求時,將比較請求消息中的Host頭字段的值與<Host>元素的name屬性值,並以匹配的<Host>元素所建立的WEB站點來響應。若是Server.xml文件中沒有與請求消息的Host頭字段匹配的<Host>元素,Tomcat將以默認的WEB站點來響應。只要<Engine>元素的defaultHost屬性設置爲嵌套在它裏面的某個<Host>元素的name屬性值,該<Host>元素所建立的WEB站點就成了該引擎的默認WEB站點。例如,Tomcat的Server.xml文件中的<Engine>元素的默認設置以下:
<Engine defaultHost="localhost" debug="0">
…
<Host name="localhost" appBase="webapps" …>
…
</Host>
…
</Engine>
上面的這段配置信息說明,該引擎的默認WEB站點爲嵌套在<Engine>元素中的name屬性爲「localhost」的<Host>元素所建立的WEB站點。
在同一臺計算機上創建了多個基於主機名的虛擬主機後,WEB瀏覽器要訪問其中的某個虛擬主機的資源時,在訪問URL中必須採用主機名,而不能採用IP地址。這是由於WEB瀏覽器要將URL中的主機名部分做爲HTTP請求消息的Host頭髮送給WEB服務器,若是URL中的主機名部分使用的是IP地址,那麼,瀏覽器發出的請求消息中的Host頭字段的值就是這個IP地址,而在同一臺計算機上創建的多個基於主機名的虛擬主機共享同一個IP地址,在Host頭字段使用IP地址根本就沒法區分不一樣的站點。
即便在URL中指定的是主機名時,WEB瀏覽器仍是要先得到該主機名所對應的IP地址,而後再使用這個IP去鏈接WEB服務器。因此,在創建基於主機名的虛擬主機時,除了要在Tomcat的server.xml文件中進行設置外,還須要在整個網絡系統中創建主機名與IP地址的映射關係,即必須將主機名添加到名稱解析系統,以便WEB瀏覽器可以從名稱解析系統中查詢出主機名所對應的IP地址。創建主機名與IP地址的映射關係的慣用方式有兩種:一是使用客戶機本地的Hosts 文件,二是使用DNS(Domain Name System,域名系統)服務器。Hosts 文件和DNS的做用都是容許用戶使用「友好」的、文本格式的主機名稱,而不是數字格式的IP地址來訪問網絡中的計算機。Hosts文件可用於小型的Intranet(企業內部網),網絡中的全部計算機上都須要使用Hosts文件。DNS一般用於大型的網絡,特別是Internet上對外提供服務的計算機都是經過DNS來創建其主機名與IP地址的映射關係。客戶機首先在本地的Hosts文件中查找主機名稱所映射的IP地址,若是沒有找到,再去查詢DNS服務器。爲了簡單起見,這裏僅介紹一下Hosts文件。對於Windows 2000系統,Hosts文件位於操做系統根目錄(取決操做系統所在的分區,一般是c:\winnt)下的System32\Drivers\Etc子目錄中,默認狀況下,該文件中有以下一行內容:
127.0.0.1
localhost
這行文本的做用就是將IP地址(127.0.0.1)映射成主機名(localhost),這也就是在IE瀏覽器地址欄中可使用localhost訪問本地WEB服務器的緣由。若是要增長更多的主機名與IP地址的映射,能夠在Hosts文件中增長更多的行,而後參照上面這行內容的格式在每行中填寫IP地址和相應的主機名。
:動手體驗:使用Tomcat創建基於主機名的虛擬主機
(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 WEB服務器程序。打開一個新的命令行窗口中,並在這個命令行窗口中執行以下命令:
telnet 127.0.0.1 8080
接着在鏈接成功的telnet程序命令窗口中,輸入以下內容:
GET /test.html HTTP/1.1<回車>
Host:<空格>site1<回車>
<回車>
這時在telnet程序窗口中能夠看到,WEB服務器返回內容的正文部分爲d:\VirtualHost1\test.html文件中的內容。接着WEB服務器返回內容的下邊,輸入以下內容:
GET /test.html HTTP/1.1<回車>
Host:<空格>site2<回車>
<回車>
在telnet程序窗口中又能夠看到,WEB服務器此次返回內容的正文部分爲d:\VirtualHost2\test.html文件中的內容。接着WEB服務器返回內容的下邊,輸入以下內容:
GET /test.html HTTP/1.1<回車>
Host:<空格><回車>
<回車>
在telnet程序窗口中又能夠看到,WEB服務器此次返回內容的正文部分爲d:\test\test.html文件中的內容。接着WEB服務器返回內容的下邊,再次輸入以下內容:
GET /test.html HTTP/1.1<回車>
Host:<空格>xxx<回車>
<回車>
在telnet程序窗口中又能夠看到,WEB服務器此次返回內容的正文部分仍然爲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網頁文件的內容。
可見,使用主機名的方式在同一臺WEB服務器上建立多個虛擬主機後,在WEB瀏覽器中使用主機名訪問Web服務器時,Web服務器將選擇與該主機名關聯的WEB站點進行響應。經過這種方式,多個WEB站點能夠共享同一個IP地址和相同的端口號,惟一不足的就是WEB瀏覽不能經過IP地址去訪問這些WEB站點。基於主機名的虛擬主機是目前Internet上的大多數虛擬主機業務提供商所一般採用的方式。只要找出幾個小型公司或我的的網站,若是在WEB瀏覽器地址欄中輸入「http://主機名」能夠訪問到該WEB站點,接着在命令行窗口中執行「ping 主機名」,查看到該域名對應的IP地址,而後在WEB瀏覽器地址欄中輸入「http://IP地址」時,卻沒法訪問這個WEB站點了,那麼,這個WEB站點就是一個基於主機名的虛擬主機,它與其餘一些WEB站點共享一臺WEB服務器,而不是本身獨享一臺WEB服務器。
注意:當使用安全套接字層 (SSL) 時,不能使用主機頭字段來實現虛擬主機,這是由於使用SSL的HTTP請求有加密保護。主機頭字段是加密內容的一部分,不能被解釋和路由到正確的站點。服務器