天天看點

深入了解Apache虛拟主機

<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)上做多域名虛拟主機

&lt;VirtualHost *&gt;

    ServerAdmin [email][email protected][/email]

    DocumentRoot /var/www/html/s1

    ServerName s1.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

&lt;/VirtualHost&gt;

    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字段)

&lt;VirtualHost *:80&gt;

&lt;VirtualHost *:81&gt;

驗證虛拟主機配置

*: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 *   去掉基于多域名的主機

&lt;VirtualHost 192.168.0.111&gt;

#    ServerName s1.domain1.com

&lt;VirtualHost 192.168.0.112&gt;

#    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,如需轉載請自行聯系原作者