<b>深入了解Apache</b><b>虛拟主機</b>
<b>環境:</b>
Rehat 9
Apache 2.0.54
IP:192.168.0.111
<b>概論:</b>
通路web服務,本質上看(從協定上)是通路某個IP的主機上的某個端口(預設是80)
通常需要通過通路不同的域名或者端口實作對不同網站的通路(具體到伺服器裡就是不同目錄),這個時候就需要設定虛拟主機(VirtualHost).通常分為這樣3種:
基于域名,基于端口,基于IP,以及它們的混合
<b>準備工作:</b>
在apache的主目錄/var/www/html/下分别建立四個檔案夾s1,s2,s3,s4,在裡面建立不同網站的首頁檔案,如s1下面建立index.html内容為this is s1, s2下面建立index.html内容為this is s2,依此類推.
另外注意一點:每次修改配置檔案httpd.conf之後apache要重新啟動,才能使配置生效
<b>下面是每種虛拟主機的配置過程</b>
<b>1.</b><b>基于域名</b>
這是一種最通用的情況,已經給伺服器設定了多個域名,然後希望通路不同的域名來通路不同的網站檔案.
修改httpd.conf的配置
# Use name-based virtual hosting.
#
NameVirtualHost * 表示在apache監聽的所有IP和所有端口(此時隻有80)上做多域名虛拟主機
<VirtualHost *>
ServerAdmin [email][email protected][/email]
DocumentRoot /var/www/html/s1
ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
ServerAdmin [email][email protected][/email]
DocumentRoot /var/www/html/s2
ServerName s2.domain1.com
ErrorLog logs/error_log
TransferLog logs/access_log
測試虛拟主機配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:* is a NameVirtualHost
default server s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1066)
port * namevhost s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1066)
port * namevhost s2.domain1.com (/usr/local/apache2/conf/httpd.conf:1075)
Syntax OK
說明文法沒問題,然後在測試機上通路這兩個域名:s1.domain1.com和s2.domain1.com可以看到各自的頁面
問題:如果以IP通路,看到的是什麼?
是s1的頁面,注意上面的這段話
default server s1.domain1.com
意思十分明顯,我們在*:*(apache監聽的任意IP任意端口上)做了多域名虛拟主機,而s1.domain1.com是這個預設的伺服器.也就是說通路*:*,除非通路的是我們設定的域名,否則預設會轉向到s1.domain1.com.
<b>2.</b><b>基于端口</b>
通過通路同一個IP(或者域名)的不同端口來通路到不同的檔案
對httpd.conf做如下修改
增加監聽口
Listen 80
Listen 81
将之前做的多域名虛拟主機去掉(因為此時是用IP加端口來通路的),即
# NameVirtualHost * 注釋掉這句話
以下是虛拟主機配置(注意下面的配置部分我并沒用ServerName字段)
<VirtualHost *:80>
<VirtualHost *:81>
驗證虛拟主機配置
*:80 192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1065)
*:81 192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1074)
在用戶端通過通路IP:80和IP:81看到不同頁面
<b>混合實驗</b>
看到這裡我們就可以做一個稍微複雜的實驗,在不同的端口上做不同域名的通路.例如
在80上通路s1.domain1.com和s2.domain1.com
在81上通路s3.domain2.com和s4.domain2.com當然這樣通路是要帶端口号的,上面因為是80預設端口是以不需要寫端口号
通路這四個域名+端口分别通路到不同的頁面.
<b>配置過程</b>
首先在bind上增加兩個域名指向伺服器. s3.domain2.com,s4.domain2.com,增加之後記得要重新開機bind.
然後修改httpd.conf檔案
虛拟主機設定
NameVirtualHost *:80
NameVirtualHost *:81
表示要在本機的所有IP的80和81上面做多域名(NameVirtualHost:即為名稱虛拟主機的意思)
DocumentRoot /var/www/html/s3
ServerName s3.domain2.com
DocumentRoot /var/www/html/s4
ServerName s4.domain2.com
檢查虛拟主機設定
root@server1 conf]# /usr/local/apache2/bin/httpd -S
*:83 192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1098)
*:81 is a NameVirtualHost
default server s3.domain2.com (/usr/local/apache2/conf/httpd.conf:1082)
這句話表示這是通路81端口預設通路到s3上(後面會看到效果)
port 81 namevhost s3.domain2.com (/usr/local/apache2/conf/httpd.conf:1082)
port 81 namevhost s4.domain2.com (/usr/local/apache2/conf/httpd.conf:1090)
*:80 is a NameVirtualHost
default server s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1065)
這句話表示這是通路80端口預設通路到s1上(後面會看到效果)
port 80 namevhost s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1065)
port 80 namevhost s2.domain1.com (/usr/local/apache2/conf/httpd.conf:1073)
重新啟動服務/usr/local/apache2/apachectl restart
通路測試頁面:
[url]http://s1.domain1.com/[/url]
[url]http://s2.domain1.com/[/url] 注意這兩個是預設端口80
[url]http://s3.domain2.com:81/[/url]
[url]http://s4.domain2.com:81/[/url] 這裡是通過不同域名通路81
注意如果後兩個不帶端口,如直接通路[url]http://s4.domain2.com[/url] 看到的會是s1的頁面,因為從80端口通路預設比對到第一個虛拟主機了,上面說了s1是80上的預設主機
同樣的,如果用80端口上設的域名通路81端口, [url]http://s1.domain1.com:81/[/url],則會看到s3的頁面.因為s3是81上的預設主機.
<b>3.</b><b>基于IP</b><b>的虛拟主機</b>
将不同的網站挂在不同的IP上,通路不同的IP,所看到的是不同網站.因為一般伺服器沒那麼多公網IP,而且大家一般都是用域名通路的.是以這個基本沒用.但是可以用來測試和學習.
<b>适用環境</b>:server上沒有配置域名,隻能用IP通路.
為了實驗效果,我們先來停掉DNS服務.
首先為伺服器增加一個IP,192.168.0.112
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@server1 network-scripts]# vi ifcfg-eth0:0
DEVICE=eth0:0 //裝置名稱
ONBOOT=yes //随系統啟動
BOOTPROTO=static
IPADDR=192.168.0.112 //新設的IP
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
激活這個裝置
[root@server1 network-scripts]# ifdown eth0;ifup eth0
檢視目前ip設定
[root@server1 network-scripts]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:EB:XX:XX:XX
inet addr:192.168.0.111 Bcast:192.168.0.255 Mask:255.255.255.0
eth0:0 Link encap:Ethernet HWaddr 00:0A:EB:XX:XX:XX
inet addr:192.168.0.112 Bcast:192.168.0.255 Mask:255.255.255.0
ping這個112确實啟用成功.
這樣增加IP的工作就完成了,下面對httpd.conf做修改
#NameVirtualHost * 去掉基于多域名的主機
<VirtualHost 192.168.0.111>
# ServerName s1.domain1.com
<VirtualHost 192.168.0.112>
# ServerName ss2.domain1.com
注意上面紅色的部分,由于此時沒用多域名是以我将ServerName字段去掉了(在多端口的時候這樣做是可以的).但是出現了下面的錯誤,可以看到它是把IP作為域名給解析了.
"httpd.conf" 1157L, 38072C written
[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.112 (check DNS) -- or specify an explicit ServerName
[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.111 (check DNS) -- or specify an explicit ServerName
192.168.0.111:* bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1065)
192.168.0.112:* bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1074)
下面我們将ServerName字段加上去,後面的名稱我們随意寫
ServerAdmin [email][email protected][/email]
ServerName s1
ErrorLog logs/dbpi_web-error_log
TransferLog logs/dbpi_web-access_log
ServerName s2
然後再來檢查虛拟主機配置
192.168.0.111:* s1 (/usr/local/apache2/conf/httpd.conf:1065)
192.168.0.112:* s2 (/usr/local/apache2/conf/httpd.conf:1075)
在客戶機上測試通路192.168.0.111和192.168.0.112成功.
個人覺得這應該是一處bug,因為在這種情況下并不需要域名通路,采用的是完全以實際IP進行通路.相應的ServerName這個字段應該是沒有意義的(正如多端口時我們這樣做,完全沒問題).事實也表明了我們任意起名字也是可以通過的.
最後說一個Apache常常會碰到的問題
啟動apache時會有警告
httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
還是能夠正常的啟動和通路,隻是有這個問題.
<b>解決:</b>
ServerName 192.168.0.111 當然根據你的實際情況修改為本機的IP或者域名
本文轉自yahoon 51CTO部落格,原文連結:http://blog.51cto.com/yahoon/36239,如需轉載請自行聯系原作者