欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

<-
Apache > HTTP Server > 文檔 > 版本2.2 > 虛擬主機(jī)
   致謝 | 譯者聲明 | 本篇譯者:金步國 | 本篇譯稿最后更新:2006年1月17日 | 獲取最新版本

深入研究虛擬主機(jī)的匹配

虛擬主機(jī)部分的代碼在Apache 1.3中進(jìn)行了完全的重寫。本文檔試圖詳細(xì)解釋Apache在接受到請求后如何確定使用哪一個(gè)虛擬主機(jī)進(jìn)行伺服。在新的NameVirtualHost指令的幫助下,虛擬主機(jī)的配置比1.3版以前更加簡單和安全。

如果您只是想讓它能夠工作而不愿意進(jìn)行深入理解,這里有一些示例

top

解析配置文件

<VirtualHost>配置段外有一個(gè)主服務(wù)器(main_server)段中包含著所有定義。其中有<VirtualHost>配置段中定義的叫做虛擬主機(jī)(vhost)的虛擬服務(wù)器。

Listen, ServerName, ServerPath, ServerAlias指令可以出現(xiàn)在一個(gè)服務(wù)器定義段的任何地方。而且每個(gè)指令都會(huì)覆蓋前面出現(xiàn)的同樣定義(在那個(gè)服務(wù)器配置中)。

主服務(wù)器段中Listen指令的默認(rèn)值是80。主服務(wù)器段沒有默認(rèn)的ServerPathServerAlias指令值。ServerName的默認(rèn)值是由服務(wù)器的IP地址推斷而來。

主服務(wù)器的Listen指令有兩個(gè)功能:其一是決定Apache將要綁定的網(wǎng)絡(luò)端口;其二是在重定向中指定絕對(duì)URI將使用的端口號(hào)。

不象在主服務(wù)器里,虛擬服務(wù)器的端口不會(huì)影響到Apache的監(jiān)聽端口。

每個(gè)VirtualHost指令中的地址都可以附帶一個(gè)可選的端口。如果沒有進(jìn)行特別的指定,這個(gè)端口默認(rèn)為主服務(wù)器中最近的一個(gè)Listen指令指定的值。特殊的端口"*"表示匹配所有端口。所有這一系列地址(包括由DNS查詢出的所有A記錄)統(tǒng)稱虛擬主機(jī)的地址集(address set)

如果沒有對(duì)一個(gè)特定的IP地址使用NameVirtualHost指令,那么第一個(gè)使用這個(gè)地址的虛擬主機(jī)將被視為基于IP的虛擬主機(jī)。IP地址也可以用通配符"*"表示。

如果使用了基于域名的虛擬主機(jī),那么必須NameVirtualHost指令為這個(gè)基于域名的虛擬主機(jī)指定IP地址集。換句話說,您必須在配置文件中通過NameVirtualHost指令指定包括主機(jī)名映射(CNAME)的IP地址。

可以使用很多NameVirtualHost指令來分別對(duì)應(yīng)一套NameVirtualHost指令,但對(duì)于每個(gè)特定的"IP:port"對(duì)來說,只能使用一次NameVirtualHost指令。

NameVirtualHostVirtualHost指令出現(xiàn)的順序并不重要。只有對(duì)應(yīng)同一個(gè)IP地址的VirtualHost指令的次序才是重要的。所以下面兩例所起的作用是完全相同的:

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
# server A
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>

NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

<VirtualHost 111.22.33.44>
# server A
</VirtualHost>
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

NameVirtualHost 111.22.33.44
NameVirtualHost 111.22.33.55

(為了使您的配置文件更具可讀性,我們推薦您使用左邊的格式)

在解析完VirtualHost指令后,虛擬主機(jī)服務(wù)器將被賦予在它的VirtualHost指令中第一個(gè)名字對(duì)應(yīng)的端口作為默認(rèn)的Listen端口。

如果所有域名都指向同一個(gè)地址集的話,VirtualHost指令中的所有域名列表都將會(huì)得到和ServerAlias指令一樣的處理(但不會(huì)被其他ServerAlias語句覆蓋)。請注意,這個(gè)虛擬主機(jī)自帶的Listen指令將不能影響到那個(gè)地址集的端口號(hào)。

在初始化的過程中,將會(huì)為每一個(gè)IP地址產(chǎn)生一個(gè)列表,并插入到一個(gè)散列表中。如果這個(gè)IP地址是用在一個(gè)NameVirtualHost指令中的,這個(gè)列表將會(huì)包含所有指定為這個(gè)IP地址的基于域名的虛擬主機(jī)。如果沒有虛擬主機(jī)針對(duì)這個(gè)IP地址,那么NameVirtualHost指令將被忽略,并會(huì)在日志中記錄一個(gè)錯(cuò)誤信息。對(duì)于基于IP的虛擬主機(jī)而言,這個(gè)散列表中的列表為空。

因?yàn)槭褂昧烁咝У纳⒘兴惴,使得在請求到達(dá)的時(shí)候在其中查找IP地址的開銷變得很小,或者根本不需考慮。而且這個(gè)表格還為只有最后一個(gè)八進(jìn)制位不同的IP地址做了優(yōu)化。

虛擬主機(jī)的每個(gè)變量都有初始值。特別是以下這些:

  1. 如果虛擬主機(jī)沒有ServerAdmin, ResourceConfig, AccessConfig, Timeout, KeepAliveTimeout, KeepAlive, MaxKeepAliveRequests, ReceiveBufferSize, SendBufferSize指令,那么將從主服務(wù)器繼承它們的值。(也就是說,使用在主服務(wù)器中最后出現(xiàn)的設(shè)定值)。
  2. 虛擬主機(jī)的默認(rèn)目錄權(quán)限將繼承主服務(wù)器的設(shè)置(包括所有模塊針對(duì)每個(gè)目錄的配置信息)。
  3. 虛擬主機(jī)將繼承主服務(wù)器中每個(gè)模塊針對(duì)主服務(wù)器的設(shè)置。

本質(zhì)上,主服務(wù)器在建立每個(gè)虛擬主機(jī)的時(shí)候,充當(dāng)了一個(gè)默認(rèn)值或根基的角色。但這些存在于主服務(wù)器中的定義的位置是無關(guān)緊要的——主服務(wù)器的配置在與虛擬主機(jī)整合之前就已經(jīng)解析過了。所以即使一個(gè)主服務(wù)器的配置出現(xiàn)在虛擬主機(jī)定義的后面,它也同樣會(huì)影響到虛擬主機(jī)的配置。

如果沒有定義主服務(wù)器中的ServerName ,那么將由運(yùn)行這個(gè)httpd服務(wù)的機(jī)器的主機(jī)名來代替。我們將由DNS查找此ServerName返回的IP地址稱為主服務(wù)器地址集(main_server address set)。

在沒有定義ServerName的情況下,一個(gè)基于域名的虛擬主機(jī)默認(rèn)采用定義虛擬主機(jī)時(shí)在VirtualHost指令中最先出現(xiàn)的地址。

所有使用了"_default_"通配符的虛擬主機(jī)將被賦予和主服務(wù)器相同的ServerName 。

top

虛擬主機(jī)匹配

服務(wù)器用下述方法來確定對(duì)一個(gè)特定的請求使用哪個(gè)虛擬主機(jī):

散列表查找

當(dāng)客戶端第一次連接的時(shí)候,會(huì)從內(nèi)部的IP散列表中查找客戶端想要連接的IP地址。

如果查找失敗(沒有找到相應(yīng)的IP地址),而所請求的端口又存在一個(gè)"_default_"虛擬主機(jī),那么這個(gè)請求將會(huì)由這個(gè)虛擬主機(jī)來伺服。如果沒有找到這樣的"_default_"虛擬主機(jī),那么這個(gè)請求將會(huì)由主服務(wù)器來伺服。

如果在散列表中沒有找到IP地址,但存在一個(gè)"NameVirtualHost *"指令與所請求的端口號(hào)相匹配,那么將用這個(gè)虛擬主機(jī)來處理這個(gè)請求。

如果查找成功(找到了對(duì)應(yīng)于這個(gè)IP地址的列表),下一步就是看我們要處理的是一個(gè)基于IP的虛擬主機(jī)還是一個(gè)基于域名的虛擬主機(jī)。

基于IP的虛擬主機(jī)

如果返回的列表中域名列表為空,那么我們處理的就是一個(gè)基于IP的虛擬主機(jī),這個(gè)虛擬主機(jī)將會(huì)直接進(jìn)行處理而不會(huì)有其他步驟。

基于域名的虛擬主機(jī)

如果返回的域名列表包含一個(gè)或多個(gè)虛擬主機(jī)的結(jié)構(gòu),那么我們處理的就是一個(gè)基于域名的虛擬主機(jī)。這個(gè)列表包含的虛擬主機(jī)的順序與配置文件中相應(yīng)VirtualHost指令出現(xiàn)的順序是相同的。

這個(gè)列表中第一個(gè)虛擬主機(jī)(也就是在配置文件中第一個(gè)指定了這個(gè)IP地址的虛擬主機(jī))對(duì)處理請求有著最高的優(yōu)先級(jí)。所有對(duì)未知服務(wù)器名或沒有"Host:"頭的請求都將由它進(jìn)行處理。

如果客戶端在請求中提供了一個(gè)"Host:"頭,那么將在列表中查找第一個(gè)ServerNameServerAlias與其符合的虛擬主機(jī),并將其用于伺服這個(gè)請求。盡管"Host:"頭中可以包含端口號(hào),但Apache還是會(huì)用收到請求的那個(gè)真實(shí)端口來進(jìn)行匹配。

如果客戶端提交了一個(gè)不包含"Host:"頭的HTTP/1.0的請求,我們將無法確認(rèn)客戶端想要連接那個(gè)服務(wù)器。而如果存在一個(gè)ServerPath與客戶端提交的請求中的URI相對(duì)應(yīng),那么列表中第一個(gè)符合條件的虛擬主機(jī)將用于伺服這個(gè)請求。

如果還是找不到對(duì)應(yīng)的虛擬主機(jī),那么這個(gè)請求將會(huì)由客戶端連接的IP對(duì)應(yīng)的列表中的第一個(gè)與請求的端口相同的虛擬主機(jī)來伺服(如前所述)。

持久連接

上述IP查找對(duì)一個(gè)特定的TCP/IP進(jìn)程只執(zhí)行一次。但在持久連接(KeepAlive)中,每個(gè)請求都會(huì)進(jìn)行一次這樣的查找過程。換句話說,一個(gè)客戶端在一個(gè)持久連接中可以向位于不同的基于域名的虛擬主機(jī)的頁面提出請求。

絕對(duì)URI

如果請求提交的URI是一個(gè)絕對(duì)URI,而其中的主機(jī)名和端口號(hào)又和主服務(wù)器或某個(gè)虛擬主機(jī)相符合,并且也與作為此請求提交對(duì)象的地址和端口相符,那么這個(gè)請求的類型/主機(jī)名/端口前綴將被抹除,僅留下相對(duì)URI為對(duì)應(yīng)的主服務(wù)器或虛擬主機(jī)所伺服。如果不滿足上述符合條件,這個(gè)URI將保留原樣,而此請求將被作為一個(gè)代理請求處理。

備忘錄

top

小技巧

作為DNS問題頁面小技巧的附加,這里有些額外的技巧: