環(huán)境:
os:ubuntu9.0.4
apache: Apache/2.2.11 (Ubuntu)
在ubuntu下apache的配置和redhat系列稍有不同
apache2的虛擬主機配置取決于幾個重要的配置文件
/etc/apache2/ports.conf 放置 NameVirtualHost指令和Listen指令
/etc/apache2/sites-enable/* 放置虛擬主機的軟鏈, 軟鏈到/etc/apache2/sites-available/目錄的同名文件 我了解為方便配置,一個文件一個虛擬主機
/etc/apache2/sites-available/* 放置虛擬主機文件的地方
apache2沒有主服務(wù)器的說法,當(dāng)然你可以配置,一切都是虛擬主機通過VirtualHost指令來配置
1)基于域名的虛擬主機
NameVirtualHost addr[:port] 這個指令是必須的
否者虛擬主機不會有效果
比如兩個配置文件www 和www1,
www
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName www.toy.org
DocumentRoot /var/www
</VirtualHost>
www1
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName www1.toy.org
DocumentRoot /var/www1
</VirtualHost>
設(shè)置NameVirtualHost *:80后一切正常,
如果不設(shè)置,http://www.toy.org 和http://www1.toy.org 都會訪問www配置
為什么都訪問www,而不是www1,到底以那個配置為準(zhǔn)
我猜測,apache2會安配置文件的名字排序,已排在前面的配置為準(zhǔn)
為了驗證這個猜測,我將www名字改為zzz,
果然http://www.toy.org 和http://www1.toy.org 都會訪問www1配置
注意NameVirtualHost 后面的addr[:port] 必須和VirtualHost 后面的addr[:port]嚴格一致,
比如NameVirtualHost *:80 VirtualHost 127.0.0.1:80是不匹配的
另外你
可通過shell腳本 /usr/sbin/apache2ctl -S
或者 二進制腳本 sudo /usr/sbin/httpd -S
調(diào)試虛擬主機設(shè)置
2)基于ip地址的虛擬主機
www
<VirtualHost 127.0.0.1:80>
ServerAdmin webmaster@localhost
ServerName www.toy.org
DocumentRoot /var/www
</VirtualHost>
www1
<VirtualHost 192.168.1.103:80>
ServerAdmin webmaster@localhost
ServerName www1.toy.org
DocumentRoot /var/www1
</VirtualHost>
無須設(shè)置NameVirtualHost
3)_default_虛擬主機
比如
<VirtualHost _default_>
DocumentRoot /www/htdocs
</VirtualHost>
如果apache找不到(ip地址:端口號)對應(yīng)的虛擬主機,那么就使用_default_虛擬主機
小結(jié)
上面兩種是虛擬主機配置最基本的情況,復(fù)雜的比如將上面的基本情況混雜在一起,但基本原理不變 :
1)基于域名的虛擬主機和基于IP的虛擬主機之間互相不干擾?;贗P的虛擬主機只接受發(fā)送到它自身地址集的請求,而不接受其他IP地址。
基于域名的虛擬主機也是一樣,它們只接受NameVirtualHost指令定義的地址集的訪問
2)永遠不會對一個基于IP的虛擬主機執(zhí)行ServerAlias和ServerPath檢查
3)僅當(dāng)沒有其他虛擬主機符合客戶端請求的IP地址和端口號時,"_default_"虛擬主機才會捕獲這個請求。
并且僅當(dāng)"_default_"虛擬主機的端口號(默認值由您的Listen指定)與客戶端發(fā)送請求的目的端口號相符時,這個請求才會被捕獲。
也可以使用通配符(例如:"_default_:*")來捕獲任何端口號的請求
4)應(yīng)當(dāng)為每個虛擬主機設(shè)定ServerName 。否則就會需要為每個虛擬主機進行DNS查詢
5)
在開啟虛擬主機的情況下,當(dāng)一個請求到達的時候,服務(wù)器會首先檢查它是否使用了一個能和NameVirtualHost相匹配的(ip地址:端口號)
如果能夠匹配,它就會查找每個與這個(ip地址:端口號)相對應(yīng)的<VirtualHost>段,并嘗試找出一個與請求的主機名相同的ServerName或ServerAlias配置項。
如果找到了,它就會使用這個服務(wù)器。否則,將使用符合這個(ip地址:端口號)的第一個列出的虛擬主機,(怎么確定第一個,這個在上文已討論 ),
如果連這個地址的虛擬主機都找不到,就去找_default_虛擬主機, 如果還找不到,返回404
6)別忘了使用上文提到的 httpd -S來調(diào)試
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點擊進入論壇