apache虛擬主機(jī)指南
:同一ip 不同端口對應(yīng)不同的站點(diǎn)目錄具體實(shí)現(xiàn):1. 在httpd.conf 中,設(shè)置listen IP:80 listen IP:8080然后在virtualhost 中設(shè)置:DocumnetRo
:同一ip 不同端口對應(yīng)不同的站點(diǎn)目錄
具體實(shí)現(xiàn):
1. 在httpd.conf 中,設(shè)置listen IP:80 listen IP:8080
然后在virtualhost 中設(shè)置:
DocumnetRoot 1
DocumnetRoot 2
我們通常所說的虛擬主機(jī)
[url=javascript:;]技術(shù)[/url]
就是將一臺(或者一組)服務(wù)器的資源(系統(tǒng)資源、網(wǎng)絡(luò)帶寬、存儲空間等)按照一定的比例分割成若干臺相對獨(dú)立的“小主機(jī)”的技術(shù)。每一臺這樣的“小主機(jī)”在功能上都可以實(shí)現(xiàn) WWW 、FTP 、Mail 等基本的Internet 服務(wù),就像使用獨(dú)立的主機(jī)一樣。
目前網(wǎng)站服務(wù)器的虛擬主機(jī)平臺使用以開放的Apache 為最多,其次是微軟的Windows IIS 。Apache 具有跨平臺(FreeBSD/Linux/Windows/Solaris/Other UNIX)、易于維護(hù)與最佳安全性等優(yōu)點(diǎn)。
Apache 是率先支持基于IP 虛擬主機(jī)的服務(wù)器之一。 Apache 1.1及其更新版本同時支持基于IP 和基于主機(jī)名的虛擬主機(jī),不同的虛擬主機(jī)有時會被稱為基于主機(jī)(host-based) 或非IP 虛擬主機(jī)(non-IP virtual hosts)。
用Apache 設(shè)置虛擬主機(jī)服務(wù)通??梢圆捎脙煞N方案:基于IP 地址的虛擬主機(jī)和基于主機(jī)名字的虛擬主機(jī),下面我們分別介紹一下它們的實(shí)現(xiàn)方法以及優(yōu)缺點(diǎn)。以便大家在具體的應(yīng)用中能夠選擇最合適的實(shí)現(xiàn)方法。
一、Apache 實(shí)現(xiàn)基于IP 地址的虛擬主機(jī)(每個站點(diǎn)擁有一個獨(dú)立IP 地址)
使用這種虛擬主機(jī)方式,首先要在服務(wù)器上為每個虛擬主機(jī)單獨(dú)設(shè)置一個IP 地址。這些IP 地址可以通過增加多個網(wǎng)卡或者在一個網(wǎng)卡上設(shè)立多個IP 地址來完成。有了多個IP 地址后,可以采用以下兩種方式之一來設(shè)置Apache 。
1、為每個虛擬主機(jī)運(yùn)行一份Apache
采用這種方式,每一份Apache 程序可以以單獨(dú)的用戶運(yùn)行,因此各個虛擬主機(jī)之間互不影響。設(shè)置這種虛擬主機(jī)時,只要為每一份Apache 設(shè)置一套配置文件就可以了,唯一需要注意的是:必須使用“Listen ”語句,強(qiáng)制每一份Apache 僅僅在屬于“自己”的IP 地址上接收服務(wù)請求。
優(yōu)點(diǎn):各個虛擬主機(jī)之間互不干擾,安全性高。
缺點(diǎn):占用系統(tǒng)資源較多。
2、多個虛擬主機(jī)共享同一份Apache
采用這種方式,各個虛擬主機(jī)共享同一份Apache ,因此各個虛擬主機(jī)之間有一定的影響,尤其是執(zhí)行CGI 程序時,可能會帶來一些嚴(yán)重的安全問題。設(shè)置這種虛擬主機(jī)時,只要為每一個虛擬主機(jī)設(shè)置類似如下的信息即可:
DocumentRoot /www/ghq1
…
優(yōu)點(diǎn):占用系統(tǒng)資源比上一種方式少。
缺點(diǎn):安全性低,每個虛擬主機(jī)仍然需要占用一個IP 地址。
,例如服務(wù)器一個網(wǎng)卡上綁定有兩個IP 地址(172.16.3.40和 172.16.3.50)分別對應(yīng)域名 www.ghq1.com 和www.ghq2.org 的服務(wù),配置如下:
服務(wù)器配置(apache 的配置文件httpd.conf )
Listen 80
DocumentRoot /www/ghq1
ServerName www.ghq1.com
DocumentRoot /www/ghq2
ServerName www.ghq2.org
配置簡單說明:“Listen ”默認(rèn)httpd 服務(wù)會監(jiān)控第80號通信端口, “Listen ”選項讓用戶自行指定apache 服務(wù)器監(jiān)控的IP 地址或通信端口。
“DocumentRoot ”:指定apache 服務(wù)器存放網(wǎng)頁的根目錄;“ServerName ”:允許用戶自行設(shè)置主機(jī)名,這個名稱將被送到遠(yuǎn)程連接程序,以取代安裝apache 服務(wù)器主機(jī)的真實(shí)名稱。和構(gòu)成虛擬主機(jī)的語法結(jié)構(gòu),其中的IP 就是我們在服務(wù)器上綁定的不同的IP 地址,也可以是IP 地址加上通信端口號(見下面的例子)。
如果服務(wù)器有兩個IP 地址(172.16.3.40和 172.16.3.50)分別對應(yīng)域名 www.ghq1.com 和www.ghq2.org 。對每個域名,我們都希望在80端口和8080端口發(fā)布我們的網(wǎng)站??梢赃@樣配置:
服務(wù)器配置(apache 的配置文件httpd.conf )
Listen 172.16.3.40:80
Listen 172.16.3.40:8080
Listen 172.16.3.50:80
Listen 172.16.3.50:8080
DocumentRoot /www/ghq1-80
ServerName www.ghq1.com
DocumentRoot /www/ghq1-8080
ServerName www.ghq1.com
DocumentRoot /www/ghq2-80
ServerName www.ghq1.org
DocumentRoot /www/ghq2-8080
ServerName www.ghq2.org
因此,建立虛擬主機(jī),我們要做好不同的IP 對應(yīng)的域名解析
,[url=javascript:;]工作[/url]
,建立相應(yīng)的目錄(如/www/ghq1),將相應(yīng)的主頁內(nèi)容存放在相應(yīng)的目錄中即可。
二、Apache 實(shí)現(xiàn)基于主機(jī)名的虛擬主機(jī)服務(wù)(一個IP 地址實(shí)現(xiàn)多個網(wǎng)站)
基于主機(jī)名字的虛擬主機(jī)服務(wù),是目前虛擬主機(jī)比較常用的一種方案。因為它不需要更多的IP 地址,無須什么特殊的軟硬件支持。而且現(xiàn)在的瀏覽器大都支持這種虛擬主機(jī)的實(shí)現(xiàn)方法?;谟蛎牡奶摂M主機(jī)是根據(jù)客戶端提交的HTTP 頭中的關(guān)于主機(jī)名的部分決定的。使用這種技術(shù),很多虛擬主機(jī)可以享用同一個IP 地址。
基于域名的虛擬主機(jī)相對比較簡單,因為我們只需要配置DNS 服務(wù)器將每個主機(jī)名映射(CNAMES )到正確的IP 地址,然后配置Apache HTTP服務(wù)器,令其辨識不同的主機(jī)名就可以了。基于域名的服務(wù)器也可以緩解IP 地址(IPV4)不足的問題。這種方式下,各個虛擬主機(jī)共享同一份Apache ,因此有CGI 程序運(yùn)行時,安全性也不高。
優(yōu)點(diǎn):只要一個IP 地址就可以提供大量的虛擬主機(jī)服務(wù)。
缺點(diǎn):安全性差。維護(hù)這些虛擬主機(jī)時需要更改配置文件,并且需要重新啟動Apache 進(jìn)程才能起作用。因此不適合進(jìn)行大規(guī)模的虛擬主機(jī)服務(wù)。
如果服務(wù)器只有一個IP 地址,而在DNS 中有很多映射到這個機(jī)器。我們想要在這個機(jī)器上運(yùn)行www.ghq1.com 和 www.ghq2.org 兩個站點(diǎn)。在Apache 服務(wù)器的配置中創(chuàng)建一個虛擬主機(jī)并不會自動在DNS 中對主機(jī)名做相應(yīng)更新。我們必須自己在DNS 中添加域名來指向我們的IP 地址。否則別人是無法看到我們的web 站點(diǎn)。
服務(wù)器配置(apache 的配置文件httpd.conf )
# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *
DocumentRoot /www/ghq1
ServerName www.ghq1.com
# Other directives here
DocumentRoot /www/ghq2
ServerName www.ghq2.org
# Other directives here
因為*(星號)匹配所有的地址,所以主服務(wù)器不接收任何請求。因為 www.ghq1.com 首先出現(xiàn)在配置文件中,所以它擁有最高優(yōu)先級,可以認(rèn)為是默認(rèn)或首要服務(wù)器。這意味著如果一個接受的請求不能與某個ServerName 指令相匹配, 它將會由第一個VirtualHost 所伺服。
當(dāng)我們的IP 地址無法確定的時候,使用*是很方便的--比如說, ISP 給我們配置的是動態(tài)IP 地址(如ADSL 撥號上網(wǎng)),而我們有使用了某種動態(tài)域名解析系統(tǒng)時。因為*匹配任何IP 地址,所以在這樣的情況下,不論IP 地址如何變化,我們都不需要另外進(jìn)行配置。上述配置就是我們在絕大多數(shù)情況下使用基于域名的虛擬主機(jī)時將要用到的。
關(guān)于DNS 和Apache
本文檔的涵義一言以蔽之就是:不要讓Apache 在解析配置文件的時候用到DNS 。 如果
,Apache 在解析配置文件時用到了DNS ,您的服務(wù)器就會發(fā)生可靠性的問題(也可能根本無法啟動) , 或者遭致拒絕(偷竊) 服務(wù)攻擊(包括用戶可以從其他用戶那里偷竊點(diǎn)擊) 。 一個簡單示例
拒絕服務(wù)
"main server"地址
避免這些問題的小技巧
附錄:進(jìn)一步的提示
一個簡單示例
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
為了讓Apache 功能正常,一個虛擬主機(jī)絕對需要以下兩部分的信息: ServerName 和與服務(wù)器對應(yīng)的至少一個IP 地址。 這個示例沒有包括IP 地址,于是Apache 必須用DNS 來查詢www.abc.dom 的地址。 如果在某些不可預(yù)料的情況下,當(dāng)您的服務(wù)器解析配置文件時沒有得到DNS 的支持, 那么這個虛擬主機(jī) 將不會被配置。 它將不會對任何請求作出反應(yīng)。(在Apache 的1.2版本之前,服務(wù)器甚至無法啟動) 。
假設(shè)www.abc.dom 的IP 地址是10.0.0.1。那么看看以下這個配置片斷:
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
現(xiàn)在Apache 需要DNS 對這個虛擬主機(jī)進(jìn)行反向域名解析來確定ServerName 。 如果反向解析失敗,那么這將導(dǎo)致這個虛擬主機(jī)部分功能喪失。 (在Apache 的1.2版本之前,服務(wù)器將不能啟動) 。如果虛擬主機(jī)是基于域名的, 它將完全不能使用,但如果它是基于IP 的,那么它將很有可能工作。 然而,如果Apache 不得不為一個已經(jīng)包含了服務(wù)器域名的服務(wù)器產(chǎn)生一個完整的URL , 那么它將可能產(chǎn)生一個無效的URL 。
以下是一個可以避免上述兩個問題的配置片斷.
ServerName www.abc.dom
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
拒絕服務(wù)
拒絕服務(wù)主要由(至少) 兩種形式導(dǎo)致。 如果您在運(yùn)行Apache 1.2以前的版本,在上述兩種情況下,如果您的任何一個虛擬主機(jī)的DNS 解析失敗,您都會無法啟動服務(wù)。在一些情況下,DNS 解析甚至不在您的控制范圍之內(nèi)。 比如說,如果abc.dom 是您的一個客戶,而且他們自己控制著DNS 。 那么僅僅是因為他們刪除了www.abc.dom 這個記錄, 都會導(dǎo)致您的服務(wù)器(1.2之前的版本) 無法啟動。
另外一種形式就更隱蔽了。比如說下面這個配置片斷:
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
,ServerAdmin webguy@def.dom
DocumentRoot /www/def
假設(shè)您已經(jīng)為www.abc.dom 設(shè)定了10.0.0.1,而為www.def.dom 設(shè)定了10.0.0.2。 更進(jìn)一步,假設(shè)def.com 自己控制DNS 。在這種配置下, 您已經(jīng)把def.com 放到了一個可以將所有指向abc.com 的所有流量據(jù)為己有的情況之下。為了達(dá)到這樣的目的,他們只需要把www.def.dom 的地址解析設(shè)置成10.0.0.1就可以了。因為他們控制著自己的DNS 服務(wù), 所以您無法阻止他們把 www.def.com 這個記錄指向任何一個IP 地址。
然后,所有向10.0.0.1發(fā)出的請求 (包括用戶所有類似http: //www.abc.dom/任何字符的URL) 都將會為def.com 這個虛擬主機(jī)所接收。 為了更好的理解著一切是怎樣發(fā)生的, 您需要一個關(guān)于 Apache 是怎樣將進(jìn)入的請求分配給它的虛擬主機(jī)的深入說明。 您可以在這里發(fā)現(xiàn)一個完整的文檔。
"main server"地址
在Apache 1.1 中,基于域名的虛擬主機(jī)支持 需要Apache 知道運(yùn)行著httpd 的主機(jī)的IP 地址。 一般來說可以用全局變量ServerName(如果存在) 或者調(diào)用C 的方法gethostname(與在命令行模式下鍵入hostname 得到的返回值一樣) 。 接著它就會利用DNS 來查找這個地址。目前還沒有辦法避免這樣的查找。
如果您擔(dān)心這樣的查找會因為您的DNS 服務(wù)器沒有啟動而遭到失敗的結(jié)果, 您就可以在/etc/hosts中插入一條記錄來確定主機(jī)名 (此文件中應(yīng)該已經(jīng)存在這條記錄了,否則您的機(jī)器無法正常啟動) 。 然后,您要確認(rèn)您的機(jī)器已經(jīng)配置為當(dāng)DNS 解析失敗的情況下, 它將會使用/etc/hosts根據(jù)所使用的操作系統(tǒng)不同, 您可能需要在/etc/resolv.conf或/etc/nsswitch.conf 兩個文件中選擇一個進(jìn)行編輯。
如果您的服務(wù)器不必因為其他理由而使用DNS , 您也許不必在把HOSTRESORDER 環(huán)境變量設(shè)置為 "local" 的情況下運(yùn)行Apache 。 這都取決于您所使用的操作系統(tǒng)和解析庫。如果您沒有使用mod_env來控制環(huán)境變量,它還將影響到 CGI 。強(qiáng)烈建議您參考一下您所使用的操作系統(tǒng)附帶的man 幫助或FAQ 。
避免這些問題的小技巧
在VirtualHost 中使用IP 地址
在Listen 中使用IP 地址
確保所有的虛擬主機(jī)擁有顯式的ServerName 定義。
創(chuàng)建一個不包含任何服務(wù)頁面的服務(wù)器
附錄:進(jìn)一步的提示
涉及到DNS 的情況都很讓人不舒服。 在Apache 1.2 中,我們努力想讓服務(wù)器在DNS 解析失敗的情況下至少保持能夠啟動, 但可能我們還是沒能做到最好。在當(dāng)今重編號成了必須的Internet 上面, 在配置文件中顯式的寫明IP 地址已經(jīng)成為不合時宜的行為了。
上述盜竊攻擊的解決辦法是, 在一個正向的DNS 查詢結(jié)果后部署一個逆向DNS 解析并將兩個域名進(jìn)行比較。 如果不同,就禁用相應(yīng)的虛擬主機(jī)。 這個方法需要一個正確配置了的逆向域名解析服務(wù)器 (因為FTP 服務(wù)器和TCP 封裝進(jìn)行的“雙重逆向”DNS 處理的普遍應(yīng)用,這已為大部分管理員所熟知了) 。
在某些情況下,如果沒有使用IP 地址而DNS 解析又失敗了,那么正常啟動一個基于域名的虛擬主機(jī)看來是不可能的。 一些諸如禁用部分配置文件這樣的權(quán)宜之計會帶來比根本不能啟動更遭的不可預(yù)測的結(jié)果。
隨著HTTP/1.1的部署以及瀏覽器和代理服務(wù)器開始支持Host 頭,我們完全避免使用基于IP
,的虛擬主機(jī)也逐漸成為可能。 這種狀況下,web 服務(wù)器也不必在配置時進(jìn)行DNS 的查詢。 但在1997年3月,這些特性的采用還沒有廣泛到可以在重要的web 服務(wù)器應(yīng)用的地步。 www.uplinux.com/download/doc/apache/ApacheManual/dns-caveats.html
www.uplinux.com/download/doc/apache/ApacheManual/mod/core.html
和用于封裝一組僅施用于特定虛擬主機(jī)的指令。任何在虛擬主機(jī)配置中可以使用的指令也同樣可以在這里使用。當(dāng)服務(wù)器接受了一個特定虛擬主機(jī)的文檔請求時,它會使用封裝在配置段中的指令。地址可以是
虛擬主機(jī)的IP 地址;
虛擬主機(jī)IP 地址對應(yīng)的完整域名;
字符*,僅與NameVirtualHost *配合使用以匹配所有的IP 地址;或是
字符串_default_,與基于IP 的虛擬主機(jī)聯(lián)用以捕獲所有沒有匹配的IP 地址。
示例
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
IPv6的地址必須放入方括號中指定,否則作為可選項的端口號將無法確定。一個IPv6的示例如下:
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
每個虛擬主機(jī)必須對應(yīng)不同的IP 地址、端口號或是不同的主機(jī)名。在第一種情況下,服務(wù)器所在物理機(jī)器必須配置為可以為多個地址接受IP 包。(在機(jī)器沒有多個網(wǎng)絡(luò)硬件界面的情況下,如果您的操作系統(tǒng)支持,您可以使用ifconfig alias命令來達(dá)到這個目的。)。
當(dāng)使用基于IP 的虛擬主機(jī)時,特殊的名稱_default_可以在沒有匹配上其它列出的虛擬主機(jī)的情況下作為匹配任何IP 地址的虛擬主機(jī)。在沒有進(jìn)行 _default_虛擬主機(jī)的設(shè)定時,在沒有IP 與請求匹配的情況下,將使用“主服務(wù)器”(包括所有在虛擬主機(jī)配置段之外的配置)的配置。(但請注意:任何匹配NameVirtualHost 指令的IP 地址既不會使用"main" 服務(wù)器配置,也不會使用_default_虛擬主機(jī)的配置。參閱基于域名的虛擬主機(jī)文檔獲得更多詳情。) 您可以指定一個:端口來改變匹配的端口。如果沒有指定,它將沿用主服務(wù)器中離它最近的那個Listen 語句指定的值。您也可以指定:*來匹配那個地址上的所有端口。(當(dāng)您使用_default_時,這是推薦采用的方法。)
安全提示:參閱安全提示文檔獲得為什么當(dāng)您存儲
[url=javascript:;]日志[/url]
文件的目錄對于啟動服務(wù)器以外的用戶來說是可寫的會危及服務(wù)器安全的詳細(xì)資料。
注意:的使用不會影響到Apache 偵聽的地址。您也許需要使用Listen 來確保Apache 偵聽著正確的地址。
本文有經(jīng)典論壇 劍氣凌人 收集整理
為調(diào)試程序,本機(jī)安裝iis 與apache ,無法同時使用80端口,現(xiàn)給出解決方法:
,方法一:
IIS5,多IP 下共存,IIS 為192.168.0.1,apache 為192.168.0.2 原文地址
c:Inetpub?minscrīpts
cscrīpt adsutil.vbs set w3svc/disablesocketpooling true
該命令反饋如下disablesocketpooling : (BOOLEAN) True
重啟IIS
Inetpub?minscrīpts>cscrīpt adsutil.vbs set w3svc/disablesocketpooling true
由于 DisableSocketPooling 在 IIS 6.0 元
[url=javascript:;]數(shù)據(jù)庫[/url]
架構(gòu) (MBSchema.xml) 中被定義為有效屬性,所以,您仍然可以使用 Adsutil.vbs 設(shè)置該屬性,但這種設(shè)置不起作用。IIS 6.0 中的功能是新增的核心級別驅(qū)動程序 HTTP.sys 的一部分。要配置 HTTP.sys ,您必須使用 Httpcfg.exe
方法二:
IIS6,多IP 下共存,IIS 為192.168.0.1,apache 為192.168.0.2 原文地址
到2003的CD 下的 support/tools/Support.cab。解壓出httpcfg.exe 文件,COPY 到windows/system32/目錄下,用法自己看幫助
命令行
綁定到某IP : httpcfg set iplisten -i 192.168.0.1
即命令使用IIS 的只監(jiān)聽指定的IP 及端口
查看綁定: httpcfg query iplisten
刪除綁定: httpcfg delete iplisten -i 192.168.0.1
命令行
net stop Apache2
net stop iisadmin /y
net START Apache2
net START w3svc
保證iis 下的ip 設(shè)置為全局默認(rèn),Apache 中httpconf 設(shè)置listen 192.168.0.2:80,就應(yīng)該可以兩個服務(wù)同時運(yùn)行,相互不沖突了。
IIS 的訪問地址為http://192.168.0.1,Apache 訪問地址為http://192.168.0.2
方法三:
網(wǎng)上常用的單IP 共用80端口方法,不過不推薦,只是使用Apache 的代理,速度有影響將apache 設(shè)為使用80端口,IIS 使用其它端口,比如81,然后將apache 作為IIS 的代理。 在httpd.conf 里面,取消下面四行的注釋:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
然后建立一個虛擬主機(jī),將該域名的所有訪問轉(zhuǎn)向81端口。
ServerName iloves.vicp.net
ProxyPass /
localhost
ProxyPassReverse /
localhost
這樣,對外就可以只需要一個端口,即可同時使用apache 和IIS 的功能了
,類推,使用第二種方法,你可以在IIS 上配置PHP4,Apache2中配置PHP5,只需要IIS 中安裝PHP4,把
[url=javascript:;]php[/url]
.ini 復(fù)制到windows目錄即可,這個就不用說了吧,Apache2中,只要把PHP5的php.ini 放在PHP5安裝目錄里面就行了
配置Apache 以支持PHP5:
LoadModule php5_module "D:/PHPServer/PHP5/php5apache2.dll"
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
PHPIniDir "D:/PHPServer/PHP5"
其中最重要的一條就是 PHPIniDir ,用來指明php.ini 文件所在位置,即PHP5的安裝目錄,注意所有目錄的應(yīng)該改為D: /PHPServer/PHP5這種格式,而非D:PHPServerPHP5,IIS 的訪問地址為http://192.168.0.1, Apache 訪問地址為http://192.168.0.2