[轉載]Apache下的虛擬主機設置

作者:wind521
原出處:http://bbs.chinaunix.net/viewthread.php?tid=42980 (ChinaUnix論壇)

題目:Apache下的虛擬主機設置
發表: leaper
整理: wind521

摘要:本文介紹了WWW服務器的虛擬主機的工作原理,討論了在Apache WWW服務器下的各種虛擬主機、尤其是大規模虛擬主機的設置技術,並比較了各種方式的特點。
關鍵詞:Apache WWW Virtual Hosting 虛擬主機

一、WWW服務器虛擬主機原理
WWW服務器虛擬主機是指使用一台物理機器,充當多個主機名的WWW服務器。比如由一台機器同時提供http://www.company1.com, http://www.company2.com 等的WWW服務,而瀏覽這些WWW站點的用戶感覺不到這種方式下跟由不同的機器提供不同的服務有什麼差別。

使用WWW虛擬主機的好處在於,一些小規模的網站,通過跟其他網站共享同一台物理機器,可以減少系統的運行成本,並且可以減少管理的難度。另外,對於個人用戶,也可以使用這種虛擬主機方式來建立有自己獨立域名的WWW服務器,目前國內有很多公司都提供這種免費的服務。

WWW虛擬主機有兩種工作方式:

1.1 基於IP地址的虛擬主機方式
這種方式下,不同的主機名解析到不同的IP地址,提供虛擬主機服務的機器上同時設置有這些IP地址。服務器根據用戶請求的目的IP地址來判定用戶請求的是哪個虛擬主機的服務,從而進一步的處理。
缺點:基於IP地址的虛擬主機方式需要在提供虛擬主機服務的機器上設立多個IP地址,既浪費了IP地址,又限制了一台機器所能容納的虛擬主機數目。因此這種方式越來越少使用。但是,這種方式是早期使用的HTTP 1.0協議唯一支持的虛擬主機方式。

1.2 基於主機名的虛擬主機方式
由於基於IP地址的虛擬主機方式有如上的缺點,HTTP 1.1協議中增加了對基於主機名的虛擬主機的支持。具體說,當客戶程序向WWW服務器發出請求時,客戶想要訪問的主機名也通過請求頭中的「Host:」語句傳遞給WWW服務器。比如,www.company1.com, www.company2.com 都對應於同一個IP地址(即由同一台機器來給這兩個虛擬域名提供服務),客戶程序要存取http://www.company1.com/index.html時,發出的請求頭中包含有如下的內容:
GET /index.html HTTP/1.1
Host: www.company1.com
…..
WWW服務器程序接收到這個請求後,可以通過檢查「Host:」語句,來判定客戶程序請求是哪個虛擬主機的服務,然後再進一步的處理。
優點:提供虛擬主機服務的機器上只要設置一個IP地址,理論上就可以給無數多個虛擬域名提供服務,佔用資源少,管理方便。目前基本上都是使用這種方式來提供虛擬主機服務。
缺點:在早期的HTTP 1.0版本下不能使用。實際上現在使用的瀏覽器基本上都支持基於主機名的虛擬主機方式。

二、Apache服務器下的虛擬主機設置技術

2.1 Apache WWW服務器簡介
Apache WWW服務器是目前Internet上使用最廣的WWW服務器軟件。通過靈活的配置,它可以完成幾乎您想得到的功能。本文主要介紹在Apache 下設置各種虛擬主機的方法。

2.2 Apache WWW服務器下基於IP地址的虛擬主機設置
使用這種虛擬主機方式,首先要在服務器上為每個虛擬主機單獨設置一個IP地址。這些IP地址可以通過增加多個網卡或者在一個網卡上設立多個IP地址來完成。有了多個IP地址後,可以採用以下兩種方式之一來設置Apache:
2.2.1 為每個虛擬主機運行一份Apache
採用這種方式,每一份Apache程序可以以單獨的用戶運行,因此各個虛擬主機之間互不影響。設置這種虛擬主機時,只要為每一份Apache設置一套配置文件就可以了,唯一需要注意的是:必須使用「Listen」語句,強制每一份Apache 僅僅在屬於「自己」的IP地址上接收服務請求。
優點:各個虛擬主機之間互不干擾,安全性高。
缺點:佔用系統資源較多。

2.2.2多個虛擬主機共享同一份Apache
採用這種方式,各個虛擬主機共享同一份Apache,因此各個虛擬主機之間有一定的影響,尤其是執行CGI程序時,可能會帶來一些嚴重的安全問題。設置這種虛擬主機時,只要為每一個虛擬主機設置類似如下的信息即可
;
DocumentRoot /home/company1

;
優點:佔用系統資源比上一種方式少。
缺點:安全性低,每個虛擬主機仍然需要佔用一個IP地址。

2.3 Apache WWW服務器下簡單的基於名字的虛擬主機設置
這種方式下,各個虛擬主機共享同一份Apache,因此有CGI程序運行時,安全性也不高。設置這種虛擬主機時,只要為每一個虛擬主機設置類似如下的信息即可
NameVirtualHost 111.222.33.44 ; 在這個IP地址接收虛擬主機的服務
;
ServerName www.company1.com
DocumentRoot /www/company1
;
;
ServerName www.company2.com
DocumentRoot /www/company2
;
優點:只要一個IP地址就可以提供大量的虛擬主機服務。
缺點:安全性差。維護這些虛擬主機時需要更改配置文件,並且需要重新啟動Apache進程才能起作用。因此不適合進行大規模的虛擬主機服務。

2.4 Apache WWW服務器下基於名字的大規模虛擬主機設置
所謂大規模虛擬主機,是指能夠提供非常多的虛擬主機服務,比如能提供超過數十萬個域名的虛擬主機服務。如果使用以上討論的方法,是很難完成的。實現這種服務的一種方式是利用Apache 功能強大的URL重寫功能。下面以一個實例來說明這種方式。

2.4.1 Apache中URL重寫功能
Apache 1.2及以後版本都有URL重寫(Rewrite)功能。簡單的說,URL重寫功能就是在Apache接收到請求後,在處理的過程中能根據預先設定的規則,對請求中的URL進行修改。這些規則主要由正規表達式組成。重寫依賴於輸入的URL、各種服務器端環境變量、HTTP請求頭中的內容、時間,甚至可以通過外部的程序來使用數據庫中的信息來幫助重寫。
URL重寫功能非常強大,通過URL重寫,可以使Apache完成異常複雜的功能。當然,URL重寫功能本身也比較複雜,關於URL重寫功能的詳細說明可以參看Apache 的隨機文檔。

2.4.2 使用Apache中URL重寫功能實現基於名字的大規模虛擬主機設置
假設機器www.home.com提供名字形如abcde.home.com、hijk.home.com等的大規模虛擬主機服務。其中虛擬主機名必須是字母或數字,並且長度至少為3。為了防止一個目錄下文件或子目錄太多而對性能產生很大的負面影響,對用戶的目錄按照名字進行分級劃分,如虛擬主機abcde.home.com的相關文件存放在目錄/member/ab/de/abcde下面。其中「ab」、「de」分別是「abcde」的前邊兩個字符和最後兩個字符。當用戶請求http://abcde.home.com時,系統應該返回/member/ab/de/abcde下面的文件。下面是為了完成這種功能需要進行的設置:

1. 對域名服務器的設置
假設www.home.com的IP地址為202.103.190.57,在域名服務器DNS的home.com數據文件中增加一行:
——————————————————————————–
* IN A 202.103.190.57
——————————————————————————–
這樣,所有 *.home.com的IP地址都會被解析為202.103.190.57,就沒有必要為各個虛擬主機分別進行設置。

2. 對Apache的設置
首先使用命令「httpd -l」檢查mod_rewrite模塊是否已經編譯到Apache中,如果沒有,重新編譯Apache。
然後在Apache的配置文件httpd.conf中增加如下語句(其中以「#」開頭的為注釋):
——————————————————————————–
#禁止使用機器的正式名
UseCanonicalName off
#使能重寫功能
RewriteEngine on
RewriteMap lowercase int:tolower
# 為安全考慮,對CGI程序不進行重寫
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# 對www.home.com不重寫,其他的重寫
RewriteCond ${lowercase:%{HTTP_HOST}} !^www\.home\.com(\.*)$
RewriteCond ${lowercase:%{HTTP_HOST}} ^[a-z0-9-]+\.home\.com(\.*)$
# 首先把機器名改為小寫,添加到請求的文件路徑前,並繼續處理
RewriteRule ^(.+) ${lowercase:%{HTTP_HOST}}$1 [C]
# 重寫請求
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9])\.home\.com([\.]*)/(.*) /member/$1$2/$2$3/$1$2$3/$5
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9]*)([a-z0-9])([a-z0-9])\.home\.com([\.]*)/(.*) /member/$1$2/$4$5/$1$2$3$4$5/$7
———————————————————————————
優點:只要一個IP地址就可以提供大量的虛擬主機服務,維護方便。
缺點:安全性低。上例為了增強安全性,禁止運行用戶自己的CGI程序。

2.5 Apache WWW服務器下的重定向虛擬主機設置
重定向虛擬主機是指僅僅提供重定向功能,而不實際存放用戶主頁數據的虛擬主機。比如,某站點有多個鏡像服務器,假設為www1.user.com、www2.user.com,…wwwn.user.com。這些服務器放在不同的網絡上,分佈於各地的客戶訪問這些服務器的速度也互不相同。而站點www.home.com通過虛擬域名user.home.com為這些鏡像的服務器提供虛擬主機服務。當客戶訪問http://user.home.com時,www.home.com根據用戶的IP地址、收集到的網絡拓撲結構信息,把客戶重定向到對該客戶來說訪問速度最快的站點。
重定向虛擬主機服務也可以通過使用URL重寫功能來完成。這裡僅給出簡單的重寫規則:
————————————————————————————
RewriteRule ^([a-z0-9]+)\.home\.com([\.]*)/(.*) /www/cgi-bin/nph-redirect.cgi/$1/$3 [T=application/x-httpd-cgi,L]
————————————————————————————
其中,nph-redirect.cgi為一個CGI程序,為了實現自動重定向,它需要產生完整的HTTP 應答頭信息。該程序通過環境變量PATH_INFO得到用戶請求的URL,通過環境變量REMOTE_ADDR得到用戶的IP地址,並根據網絡拓撲情況生成重定向信息,返回給客戶。

參考文獻:
1.Apache 1.3 User’s Guide http://www.apache.org

Virtual Hosting Setup Using Apache
Abstract:
There are two types of WWW Virtual Hosting, IP-based and Name-based. Those two types are introduced in this thesis, followed by some methods about WWW Virtual Hosting configuration under Apache and the difference between them is analyzed.