環境:
Rehat 9
Apache 2.0.54
IP:192.168.0.111
概論:
訪問web服務,本質上看(從協議上)是訪問某個IP的主機上的某個端口(默認是80)
一般須要經過訪問不一樣的域名或者端口實現對不一樣網站的訪問(具體到服務器裏就是不一樣目錄),這個時候就須要設置虛擬主機(VirtualHost).一般分爲這樣3種:
基於域名,基於端口,基於IP,以及它們的混合
準備工做:
在apache的主目錄/var/www/html/下分別創建四個文件夾s1,s2,s3,s4,在裏面創建不一樣網站的主頁文件,如s1下面創建index.html內容爲this is s1, s2下面創建index.html內容爲this is s2,依此類推.
配置server的bind服務,爲它添加2個域名s1.domain1.com, s2.domain1.com,.(實際上是徹底按我以前寫的DNS設置的文章配的,只作了小小的改動而已)將客戶機的DNS指向server,在客戶機上ping 這2個域名都能返回正確的IP.
另外注意一點:每次修改配置文件httpd.conf以後apache要從新啓動,才能使配置生效
下面是每種虛擬主機的配置過程
1.基於域名
這是一種最通用的狀況,已經給服務器設置了多個域名,而後但願訪問不一樣的域名來訪問不一樣的網站文件.
修改httpd.conf的配置
# Use name-based virtual hosting.
#
NameVirtualHost * 表示在apache監聽的全部IP和全部端口(此時只有80)上作多域名虛擬主機
<VirtualHost *>
ServerAdmin
DocumentRoot /var/www/html/s1
ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *>
ServerAdmin
DocumentRoot /var/www/html/s2
ServerNames2.domain1.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
測試虛擬主機配置
[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的頁面,注意上面的這段話
*:*is a NameVirtualHost
default server s1.domain1.com
意思十分明顯,咱們在*:*(apache監聽的任意IP任意端口上)作了多域名虛擬主機,而s1.domain1.com是這個缺省的服務器.也就是說訪問*:*,除非訪問的是咱們設置的域名,不然默認會轉向到s1.domain1.com.
2.基於端口
經過訪問同一個IP(或者域名)的不一樣端口來訪問到不一樣的文件
對httpd.conf作以下修改
增長監聽口
Listen 80
Listen 81
將以前作的多域名虛擬主機去掉(由於此時是用IP加端口來訪問的),即
# Use name-based virtual hosting.
#
# NameVirtualHost * 註釋掉這句話
如下是虛擬主機配置(注意下面的配置部分我並沒用ServerName字段)
<VirtualHost *:80>
ServerAdmin
DocumentRoot /var/www/html/s1
ErrorLog logs/error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin
DocumentRoot /var/www/html/s2
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
驗證虛擬主機配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1065)
*:81192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1074)
Syntax OK
在客戶端經過訪問IP:80和IP:81看到不一樣頁面
混合實驗
看到這裏咱們就能夠作一個稍微複雜的實驗,在不一樣的端口上作不一樣域名的訪問.例如
在80上訪問s1.domain1.com和s2.domain1.com
在81上訪問s3.domain2.com和s4.domain2.com固然這樣訪問是要帶端口號的,上面由於是80默認端口因此不須要寫端口號
訪問這四個域名+端口分別訪問到不一樣的頁面.
配置過程
首先在bind上增長兩個域名指向服務器. s3.domain2.com,s4.domain2.com,增長以後記得要重啓bind.
而後修改httpd.conf文件
增長監聽口
Listen 80
Listen 81
虛擬主機設置
# Use name-based virtual hosting.
#
NameVirtualHost *:80
NameVirtualHost *:81
表示要在本機的全部IP的80和81上面作多域名(NameVirtualHost:即爲名稱虛擬主機的意思)
<VirtualHost *:80>
ServerAdmin
DocumentRoot /var/www/html/s1
ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *:80>
ServerAdmin
DocumentRoot /var/www/html/s2
ServerNames2.domain1.com
ErrorLog logs/ error_log
TransferLog logs/access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin
DocumentRoot /var/www/html/s3
ServerNames3.domain2.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin
DocumentRoot /var/www/html/s4
ServerNames4.domain2.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
檢查虛擬主機設置
root@server1 conf]# /usr/local/apache2/bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:83192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1098)
*:81is 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)
*:80is 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)
Syntax OK
從新啓動服務/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上的默認主機.
3.基於IP的虛擬主機
將不一樣的網站掛在不一樣的IP上,訪問不一樣的IP,所看到的是不一樣網站.由於通常服務器沒那麼多公網IP,並且你們通常都是用域名訪問的.因此這個基本沒用.可是能夠用來測試和學習.
適用環境: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
eth0Link encap:EthernetHWaddr 00:0A:EB:XX:XX:XX
inet addr:192.168.0.111Bcast:192.168.0.255Mask:255.255.255.0
eth0:0Link encap:EthernetHWaddr 00:0A:EB:XX:XX:XX
inet addr:192.168.0.112Bcast:192.168.0.255Mask:255.255.255.0
ping這個112確實啓用成功.
這樣增長IP的工做就完成了,下面對httpd.conf作修改
# Use name-based virtual hosting.
#
#NameVirtualHost *去掉基於多域名的主機
<VirtualHost 192.168.0.111>
ServerAdmin
DocumentRoot /var/www/html/s1
#ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost 192.168.0.112>
ServerAdmin
DocumentRoot /var/www/html/s2
#ServerNamess2.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
注意上面紅色的部分,因爲此時沒用多域名因此我將ServerName字段去掉了(在多端口的時候這樣作是能夠的).可是出現了下面的錯誤,能夠看到它是把IP做爲域名給解析了.
"httpd.conf" 1157L, 38072C written
[root@server1 conf]# ../bin/httpd -S
[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
VirtualHost configuration:
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)
Syntax OK
下面咱們將ServerName字段加上去,後面的名稱咱們隨意寫
<VirtualHost 192.168.0.111>
ServerAdmin
DocumentRoot /var/www/html/s1
ServerName s1
ErrorLog logs/dbpi_web-error_log
TransferLog logs/dbpi_web-access_log
</VirtualHost>
<VirtualHost 192.168.0.112>
ServerAdmin
DocumentRoot /var/www/html/s2
ServerName s2
ErrorLog logs/dbpi_web-error_log
TransferLog logs/dbpi_web-access_log
</VirtualHost>
而後再來檢查虛擬主機配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
192.168.0.111:*s1 (/usr/local/apache2/conf/httpd.conf:1065)
192.168.0.112:*s2 (/usr/local/apache2/conf/httpd.conf:1075)
Syntax OK
在客戶機上測試訪問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
仍是可以正常的啓動和訪問,只是有這個問題.
解決:
ServerName 192.168.0.111 固然根據你的實際狀況修改成本機的IP或者域名
本文出自 「yahoon的小屋」 博客,謝絕轉載!html