一、網(wǎng)站系統(tǒng)的組成
只要在一臺(tái)計(jì)算機(jī)上安裝了WEB服務(wù)器軟件,從功能上講,這臺(tái)計(jì)算機(jī)就可以稱為WEB服務(wù)器。一個(gè)網(wǎng)站的規(guī)模可大可小,功能可多可少,最簡(jiǎn)單的網(wǎng)站只需要一臺(tái)Web服務(wù)器即可對(duì)外提供網(wǎng)頁(yè)瀏覽服務(wù)。復(fù)雜的網(wǎng)站包括多臺(tái)WEB服務(wù)器組成的群集系統(tǒng)、負(fù)載均衡設(shè)備、具有緩存功能的代理服務(wù)器(可以有多級(jí),甚至包括放置在服務(wù)器端的緩存系統(tǒng))、數(shù)據(jù)庫(kù)系統(tǒng)等,如圖2.2所示。

圖2.2
www.sina.com網(wǎng)站系統(tǒng)采用的基本上就是圖2.2所示的架構(gòu),不同地區(qū)的人們?cè)谠L問www.sina.com站點(diǎn)時(shí),瀏覽器實(shí)際上所訪問的服務(wù)器是不一樣的,例如,吉林省的用戶訪問的服務(wù)器實(shí)際是sina放在吉林地區(qū)的代理服務(wù)器,湖北省的用戶訪問的服務(wù)器實(shí)際是sina放在湖北地區(qū)的代理服務(wù)器。各地區(qū)的瀏覽器訪問www.sina.com站點(diǎn)的過程如圖2.3所示。

圖2.3
為了能夠讓瀏覽器透明地訪問到WEB站點(diǎn),讓用戶感覺不到是在訪問區(qū)域代理服務(wù)器,在DNS系統(tǒng)中需要將www.sina.com主機(jī)名指向所有的區(qū)域代理服務(wù)器的IP地址。在瀏覽器訪問www.sina.com站點(diǎn)中的頁(yè)面而向DNS服務(wù)器請(qǐng)求解析www.sina.com主機(jī)名時(shí),DNS服務(wù)器根據(jù)訪問者的地理位置信息返回他附近的區(qū)域代理服務(wù)器的IP地址,這樣,瀏覽器的訪問請(qǐng)求將發(fā)送給該區(qū)域代理服務(wù)器。只有當(dāng)區(qū)域代理服務(wù)器中沒有瀏覽器要訪問的頁(yè)面時(shí),區(qū)域代理服務(wù)器才去從真正的www.sina.com站點(diǎn)服務(wù)器上獲取該頁(yè)面并進(jìn)行緩存,以后該區(qū)域的其他瀏覽器就都可以就近從區(qū)域代理服務(wù)器中訪問到該頁(yè)面了,從而大大提高了訪問效率和減少了網(wǎng)絡(luò)流量。
WEB瀏覽器與WEB服務(wù)器建立連接后,除了將請(qǐng)求URL中的資源路徑發(fā)送給WEB服務(wù)器外,還會(huì)將URL中的主機(jī)名部分作為HTTP請(qǐng)求消息的Host頭發(fā)送給WEB服務(wù)器。例如,在瀏覽器地址欄中輸入http://www.it315.org,瀏覽器發(fā)送給www.it315.org主機(jī)上的WEB服務(wù)器的請(qǐng)求消息內(nèi)容如下:
GET / HTTP/1.1<回車>
Host: www.it315.org<回車>
<回車>
WEB服務(wù)器接收到瀏覽器的訪問請(qǐng)求消息后,根據(jù)Host頭字段中所設(shè)置的主機(jī)名,就知道該選擇哪個(gè)WEB站點(diǎn)來進(jìn)行響應(yīng),因此,可以使用不同的主機(jī)名來作為區(qū)分同一個(gè)WEB服務(wù)器上的不同站點(diǎn)的標(biāo)識(shí)信息。
Tomcat的Server.xml配置文件中有一個(gè)<Host>元素,一個(gè)<Host>元素用于建立一個(gè)WEB站點(diǎn),使用多個(gè)<Host>元素則可以建立多個(gè)WEB站點(diǎn)。<Host>元素的父級(jí)元素為<Engine>元素,嵌套在同一個(gè)<Engine>元素中的多個(gè)<Host>元素的name屬性不能相同,<Host>元素的name屬性指定WEB站點(diǎn)所對(duì)應(yīng)的主機(jī)名稱。Tomcat的Server.xml配置文件中初始設(shè)置的<Host>元素內(nèi)容如下:
<Host name="localhost" appBase="webapps" …>
…
</Host>
<Host>元素中的appBase屬性指定了一個(gè)路徑,該路徑將作為嵌套在它里面的<Context>元素的docBase屬性中設(shè)置的相對(duì)路徑的基準(zhǔn)路徑。
當(dāng)Tomcat接收到訪問請(qǐng)求時(shí),將比較請(qǐng)求消息中的Host頭字段的值與<Host>元素的name屬性值,并以匹配的<Host>元素所創(chuàng)建的WEB站點(diǎn)來響應(yīng)。如果Server.xml文件中沒有與請(qǐng)求消息的Host頭字段匹配的<Host>元素,Tomcat將以默認(rèn)的WEB站點(diǎn)來響應(yīng)。只要<Engine>元素的defaultHost屬性設(shè)置為嵌套在它里面的某個(gè)<Host>元素的name屬性值,該<Host>元素所創(chuàng)建的WEB站點(diǎn)就成了該引擎的默認(rèn)WEB站點(diǎn)。例如,Tomcat的Server.xml文件中的<Engine>元素的默認(rèn)設(shè)置如下:
<Engine name="Standalone" defaultHost="localhost" debug="0">
…
<Host name="localhost" appBase="webapps" …>
…
</Host>
…
</Engine>
上面的這段配置信息說明,該引擎的默認(rèn)WEB站點(diǎn)為嵌套在<Engine>元素中的name屬性為“localhost”的<Host>元素所創(chuàng)建的WEB站點(diǎn)。
在同一臺(tái)計(jì)算機(jī)上建立了多個(gè)基于主機(jī)名的虛擬主機(jī)后,WEB瀏覽器要訪問其中的某個(gè)虛擬主機(jī)的資源時(shí),在訪問URL中必須采用主機(jī)名,而不能采用IP地址。這是因?yàn)?/span>WEB瀏覽器要將URL中的主機(jī)名部分作為HTTP請(qǐng)求消息的Host頭發(fā)送給WEB服務(wù)器,如果URL中的主機(jī)名部分使用的是IP地址,那么,瀏覽器發(fā)出的請(qǐng)求消息中的Host頭字段的值就是這個(gè)IP地址,而在同一臺(tái)計(jì)算機(jī)上建立的多個(gè)基于主機(jī)名的虛擬主機(jī)共享同一個(gè)IP地址,在Host頭字段使用IP地址根本就無法區(qū)分不同的站點(diǎn)。
即使在URL中指定的是主機(jī)名時(shí),WEB瀏覽器還是要先獲得該主機(jī)名所對(duì)應(yīng)的IP地址,然后再使用這個(gè)IP去連接WEB服務(wù)器。所以,在建立基于主機(jī)名的虛擬主機(jī)時(shí),除了要在Tomcat的server.xml文件中進(jìn)行設(shè)置外,還需要在整個(gè)網(wǎng)絡(luò)系統(tǒng)中建立主機(jī)名與IP地址的映射關(guān)系,即必須將主機(jī)名添加到名稱解析系統(tǒng),以便WEB瀏覽器能夠從名稱解析系統(tǒng)中查詢出主機(jī)名所對(duì)應(yīng)的IP地址。建立主機(jī)名與IP地址的映射關(guān)系的慣用方式有兩種:一是使用客戶機(jī)本地的Hosts 文件,二是使用DNS(Domain Name System,域名系統(tǒng))服務(wù)器。Hosts 文件和DNS的作用都是允許用戶使用“友好”的、文本格式的主機(jī)名稱,而不是數(shù)字格式的IP地址來訪問網(wǎng)絡(luò)中的計(jì)算機(jī)。Hosts文件可用于小型的Intranet(企業(yè)內(nèi)部網(wǎng)),網(wǎng)絡(luò)中的所有計(jì)算機(jī)上都需要使用Hosts文件。DNS通常用于大型的網(wǎng)絡(luò),特別是Internet上對(duì)外提供服務(wù)的計(jì)算機(jī)都是通過DNS來建立其主機(jī)名與IP地址的映射關(guān)系。客戶機(jī)首先在本地的Hosts文件中查找主機(jī)名稱所映射的IP地址,如果沒有找到,再去查詢DNS服務(wù)器。為了簡(jiǎn)單起見,這里僅介紹一下Hosts文件。對(duì)于Windows 2000系統(tǒng),Hosts 文件位于操作系統(tǒng)根目錄(取決操作系統(tǒng)所在的分區(qū),通常是c:\winnt)下的System32\Drivers\Etc子目錄中,默認(rèn)情況下,該文件中有如下一行內(nèi)容:
127.0.0.1 localhost
這行文本的作用就是將IP地址(127.0.0.1)映射成主機(jī)名(localhost),這也就是在IE瀏覽器地址欄中可以使用localhost訪問本地WEB服務(wù)器的原因。如果要增加更多的主機(jī)名與IP地址的映射,可以在Hosts文件中增加更多的行,然后參照上面這行內(nèi)容的格式在每行中填寫IP地址和相應(yīng)的主機(jī)名。
:動(dòng)手體驗(yàn):使用Tomcat建立基于主機(jī)名的虛擬主機(jī)
(1)用UltraEdit打開<Tomcat主目錄>/conf目錄下的Server.xml文件,使用“查找”菜單查找內(nèi)容為“</Host>”的行,緊接該行下面增加一對(duì)<Host></Host>標(biāo)簽。參照前面的<Host>標(biāo)簽的屬性設(shè)置情況,設(shè)置新增的<Host>標(biāo)簽的屬性,并在它里面嵌套一個(gè)設(shè)置該WEB站點(diǎn)根目錄的<Context>元素,最終的內(nèi)容如下:
<Host name="site1" debug="0" appBase="d:\VirtualHost1">
<Context path="" docBase="." debug="0"/>
</Host>
這樣,將創(chuàng)建一個(gè)新的WEB站點(diǎn)。上面的<Context>元素的docBase屬性值被設(shè)置為一個(gè)點(diǎn)(.),即表示使用<Host>元素的appBase屬性中所設(shè)置的路徑作為這個(gè)<Context>所映射的目錄。
(2)在上面新增的<Host></Host>標(biāo)簽對(duì)下面再增加一對(duì)<Host></Host>標(biāo)簽,并將它設(shè)置為如下形式:
<Host name="site2" debug="0" appBase="d:\VirtualHost2">
<Context path="" docBase="." debug="0"/>
</Host>
這又創(chuàng)建了一個(gè)新的WEB站點(diǎn),該站點(diǎn)的主機(jī)名稱為site2,根目錄對(duì)應(yīng)的本地文件系統(tǒng)目錄為d:\VirtualHost2。
(3)在d:盤下創(chuàng)建名稱為VirtualHost1和VirtualHost2兩個(gè)目錄,并在這兩個(gè)目錄中分別創(chuàng)建一個(gè)名為test.html的文件,在d:\VirtualHost1\test.html文件中寫入如下一行內(nèi)容:
這是d:\VirtualHost1目錄中的test.html文件
在d:\VirtualHost2\test.html文件中寫入如下一行內(nèi)容:
這是d:\VirtualHost2目錄中的test.html文件
(4)保存修改后的Server.xml文件,重新啟動(dòng)Tomcat WEB服務(wù)器程序。打開一個(gè)新的命令行窗口中,并在這個(gè)命令行窗口中執(zhí)行如下命令:
telnet 127.0.0.1 8080
接著在連接成功的telnet程序命令窗口中,輸入如下內(nèi)容:
GET /test.html HTTP/1.1<回車>
Host:<空格>site1<回車>
<回車>
這時(shí)在telnet程序窗口中可以看到,WEB服務(wù)器返回內(nèi)容的正文部分為d:\VirtualHost1\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,輸入如下內(nèi)容:
GET /test.html HTTP/1.1<回車>
Host:<空格>site2<回車>
<回車>
在telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分為d:\VirtualHost2\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,輸入如下內(nèi)容:
GET /test.html HTTP/1.1<回車>
Host:<空格><回車>
<回車>
在telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分為d:\test\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,再次輸入如下內(nèi)容:
GET /test.html HTTP/1.1<回車>
Host:<空格>xxx<回車>
<回車>
在telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分仍然為d:\test\test.html文件中的內(nèi)容。
上面的整個(gè)交互過程如圖2.34所示,Tomcat根據(jù)第1次和第2次請(qǐng)求中所指定Host頭的值,查找Server.xml文件中與之相匹配的<Host>元素的name屬性值,并以匹配的<Host>元素所設(shè)置的WEB站點(diǎn)來響應(yīng);在第3次和第4次請(qǐng)求中所指定Host頭的值,在Server.xml文件中沒有與之對(duì)應(yīng)的<Host>元素的name屬性值,Tomcat將以默認(rèn)的WEB站點(diǎn)來響應(yīng)。

圖2.34
(5)在Windows 2000系統(tǒng)中,用記事本程序打開c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行內(nèi)容:
127.0.0.1 localhost
緊接這行文本的下面,用它復(fù)制出兩行文本,并將這兩行文本中的localhost分別修改成site1和site2,這樣,就使用Hosts文件為當(dāng)前計(jì)算機(jī)設(shè)置了多個(gè)主機(jī)名。如果要用site1和site2這個(gè)兩主機(jī)名訪問其他計(jì)算機(jī)上的WEB站點(diǎn),則應(yīng)將127.0.0.1修改成其他計(jì)算機(jī)的實(shí)際IP地址。保存Hosts文件后,在命令行窗口中執(zhí)行“ping site1”和“ping site2”命令,查看該主機(jī)名是否被正確解析到了相應(yīng)的IP地址上。建立site1和site2與計(jì)算機(jī)IP地址的映射后,在IE瀏覽器地址欄中輸入http://localhost:8080/test.html、http://site1:8080/test.html和http://site2:8080/test.html,可以看到瀏覽器將顯示出各自站點(diǎn)中的test.html網(wǎng)頁(yè)文件的內(nèi)容。
可見,使用主機(jī)名的方式在同一臺(tái)WEB服務(wù)器上創(chuàng)建多個(gè)虛擬主機(jī)后,在WEB瀏覽器中使用主機(jī)名訪問Web服務(wù)器時(shí),Web服務(wù)器將選擇與該主機(jī)名關(guān)聯(lián)的WEB站點(diǎn)進(jìn)行響應(yīng)。通過這種方式,多個(gè)WEB站點(diǎn)可以共享同一個(gè)IP地址和相同的端口號(hào),唯一不足的就是WEB瀏覽不能通過IP地址去訪問這些WEB站點(diǎn)。基于主機(jī)名的虛擬主機(jī)是目前Internet上的大多數(shù)虛擬主機(jī)業(yè)務(wù)提供商所通常采用的方式。只要找出幾個(gè)小型公司或個(gè)人的網(wǎng)站,如果在WEB瀏覽器地址欄中輸入“http://主機(jī)名”可以訪問到該WEB站點(diǎn),接著在命令行窗口中執(zhí)行“ping 主機(jī)名”,查看到該域名對(duì)應(yīng)的IP地址,然后在WEB瀏覽器地址欄中輸入“http://IP地址”時(shí),卻無法訪問這個(gè)WEB站點(diǎn)了,那么,這個(gè)WEB站點(diǎn)就是一個(gè)基于主機(jī)名的虛擬主機(jī),它與其他一些WEB站點(diǎn)共享一臺(tái)WEB服務(wù)器,而不是自己獨(dú)享一臺(tái)WEB服務(wù)器。
注意:當(dāng)使用安全套接字層 (SSL) 時(shí),不能使用主機(jī)頭字段來實(shí)現(xiàn)虛擬主機(jī),這是因?yàn)槭褂?/span>SSL的HTTP請(qǐng)求有加密保護(hù)。主機(jī)頭字段是加密內(nèi)容的一部分,不能被解釋和路由到正確的站點(diǎn)。