apache2.2 虛擬主機配置

1、變化httpd.conf

打開appserv安裝文件夾,找到httpd.conf文件,拆下前進行如下兩行文本#號碼。 php

#LoadModule vhost_alias_module modules/mod_vhost_alias.so
去掉#意思是啓用apache的虛擬主機功能。 

#Include conf/extra/httpd-vhosts.conf
去掉這一行的#意思是從conf/extra/httpd-vhosts.conf這個文件導入虛擬主機配置

2、改動httpd-vhosts.conf

打開該文件。看到下面相似內容。web

虛擬主機的配置也是參照下面內容配置。apache

下面對該內容進行解說app

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.www.phpStudy.net
    DocumentRoot "C:/Program Files/Apache2/docs/dummy-host.www.phpStudy.net"
    ServerName dummy-host.www.phpStudy.net
    ServerAlias www.dummy-host.www.phpStudy.net
    ErrorLog "logs/dummy-host.www.phpStudy.net-error.log"
    CustomLog "logs/dummy-host.www.phpStudy.net-access.log" common
</VirtualHost>
NameVirtualHost *:80

注意1:NameVirtualHost 指定虛擬主機所使用的IP地址或域名,但是最好是IP地址。使用基於域名的虛擬主機時,NameVirtualHost是必要的指令。NameVirtualHost可以定義多個。 
注意2:所有符合NameVirtualHost或<VirtualHost>標籤訂義的請求,都會被做爲虛擬主機處理,而主server將不理會。NameVirtualHost定義了而<VirtualHost>標籤未定義的的請求,server會找不到對應的虛擬主機而將沒法處理。因此每個NameVirtualHost定義的參數至少要有一個<VirtualHost>相匹配。.net


注意3:假設設置NameVirtualHost 或<VirtualHost>爲*:80的話,所有針對80port的請求,都會被虛擬主機處理,請求會依據域名指向某個虛擬主機。代理

假設有來自80port的請求。而所請求的域名沒有被配置爲虛擬主機,那將指向第一個虛擬主機。這樣主server將沒法收到來自80port的不論什麼請求。日誌

爲此也要爲主server配置一個虛擬主機。code

ServerAdmin 管理員郵箱server

DocumentRoot 站點文件夾 (注意:假設站點文件夾中的路徑有空格。請在路徑兩端加上雙引號)接口

ServerName 要綁定的域名(必填)

ServerAlias 要綁定的虛擬主機的別名。(可選。假設多個域名,中間以空格分隔,假設沒有。則去掉該行)

支持*,?兩種通配符。比方 *.abc.com,表示隨意一個abc.com的二級域名均可訪問。

CustomLog 用戶日誌文件(可選,假設不需要。則去掉該行)

ErrorLog 錯誤日誌(可選,假設不需要。則去掉該行)


基於IP地址的虛擬主機

<VirtualHost 172.20.30.40>
  DocumentRoot /www/example1
  ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50 192.168.0.10:80>
  DocumentRoot /www/example2
  ServerName www.example.org
</VirtualHost>
每個虛擬主機可定義多個IP,之間用空格隔開

各類虛擬主機的混用

Listen 80
Listen 81

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
    DocumentRoot /www/example1
    ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot /www/example2
    ServerName www.example.org
</VirtualHost>

NameVirtualHost 172.20.30.40:81

<VirtualHost 172.20.30.40:81>
    DocumentRoot /www/example3
    ServerName www.example3.net
</VirtualHost>

# IP-based
<VirtualHost 172.20.30.50>
    DocumentRoot /www/example4
    ServerName www.example4.edu
</VirtualHost>

<VirtualHost 172.20.30.60:81 172.20.30.40:81>
    DocumentRoot /www/example5
    ServerName www.example5.gov
</VirtualHost>

虛擬主機混用時的問題

1、虛擬主機混用可以這樣理解:一行NameVirtualHost指令定義的所有虛擬主機爲一組。該組與一個基於IP的虛擬主機平級。即把一行NameVirtualHost定義的整個組看做是一個基於IP的虛擬主機。
2、虛擬主機指定的port必須是Listen定義的。假設虛擬主機沒有指定port。則以爲是80port。

假設NameVirtualHost * 這樣定義,是指所有地址的所有已定義port。
3、更詳細的地址定義優先。比方NameVirtualHost指令定義了*:80,而某個基於IP的虛擬主機定義爲192.168.0.1:80,那麼此時若有對192.168.0.1:80的請求,那請求會被優先指向192.168.0.1:80定義的虛擬主機。因此爲了不混亂。不要定義相互有交叉或包括的地址區間。
4、一個虛擬主機。可以同一時候爲基於域名和基於IP的。如上一例中最後一個虛擬主機。這樣符合兩種定義的請求都會被指同一個虛擬主機。有時要差異內外網對虛擬主機的訪問時可以這樣,因爲來自內網的請求可能和來自外網的請求可能不同,但是它們需要指向同一個虛擬主機。

使用"_default_"虛擬主機

這個虛擬主機可以理解成基於IP的虛擬主機

<VirtualHost _default_:*>
    DocumentRoot /www/default
</VirtualHost>
這個虛擬主機將接管與其餘虛擬主機IP和port不匹配的請求。只是如此一來。主server將不會處理不論什麼請求。所以把主server配置成一個虛擬主機是必要的。

本地機器代理在其餘機器上執行的虛擬主機

<VirtualHost 158.29.33.248>
    ProxyPreserveHost On
    ProxyPass /foo/no !
    ProxyPass /foo http://192.168.111.2
    ProxyPassReverse /foo http://192.168.111.2
    ServerName hostname.example.com
</VirtualHost>
1、首先這是一個基於IP的虛擬主機,它接收並處理對IP地址158.29.33.248的請求。


2、ProxyPass /foo http://192.168.111.2 將把對http://158.29.33.248/foo的請求轉換爲一個代理請求,該請求指向http://192.168.111.2。
3、ProxyPass /foo/no ! 不代理針對/foo/no的請求。這個必須放在正常代理指令以前。
4、ProxyPreserveHost On 意思是傳送原始請求的Host信息給被代理的機器。
5、ProxyPassReverse /foo http://192.168.111.2 可以保證請求URL在其餘機器上被重定向後。本機處理時也可以保持一致。詳細看手冊關於反向代理的部分。


6、基於域名的虛擬主機也是相同的道理。不管是什麼類型的虛擬主機,它僅僅是處理歸它處理的請求而已。

配置實例

需求1:

這是一個基於IP的虛擬主機使用實例

一個項目數據應用,爲了防止由於域名解析問題致使不能正常訪問,所以採用IP的方式訪問接口。比方:http://61.122.3.6:8080/ 這種方式。虛擬主機的配置例如如下:

一、在httpd.conf中Listen 80如下添加一行,內容爲:Listen 8080,即監聽8080port

二、配置虛擬主機配置

#NameVirtualHost 61.122.3.6:8080 這一行可以不需要。經測試,基於IP地址的虛擬主機可不用設置NameVirtualHost項目。

<VirtualHost 61.122.3.6:8080> ServerAdmin webmaster@dummy-host.www.phpStudy.net DocumentRoot "d:/web/openj" </VirtualHost>

相關文章
相關標籤/搜索