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

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

深入研究虛擬主機的匹配

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

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

top

解析配置文件

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

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

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

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

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

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

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

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

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

NameVirtualHostVirtualHost指令出現(xiàn)的順序并不重要。只有對應(yīng)同一個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指令后,虛擬主機服務(wù)器將被賦予在它的VirtualHost指令中第一個名字對應(yīng)的端口作為默認的Listen端口。

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

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

因為使用了高效的散列算法,使得在請求到達的時候在其中查找IP地址的開銷變得很小,或者根本不需考慮。而且這個表格還為只有最后一個八進制位不同的IP地址做了優(yōu)化。

虛擬主機的每個變量都有初始值。特別是以下這些:

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

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

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

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

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

top

虛擬主機匹配

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

散列表查找

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

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

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

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

基于IP的虛擬主機

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

基于域名的虛擬主機

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

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

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

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

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

持久連接

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

絕對URI

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

備忘錄

top

小技巧

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