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>

相关文章
相关标签/搜索