`

apache 虚拟主机示例

    博客分类:
  • php
阅读更多
apache 虚拟主机示例
本文档试图解释一些在设置虚拟主机时经常问及的问题。这些示例向你展示了如何在一个服务器上通过基于域名的或是基于IP的虚拟主机来部署多个web站点。另一份关于如何在一个代理服务器后构建基于多个服务器的站点的说明文档也很快就会出来。


在一个IP地址上运行多个基于域名的web站点
您的服务器有只一个IP地址,而在DNS中有很多域名(CNAMES)映射到这个机器。您而您想要在这个机器上运行www.example.com和www.example.org两个站点。

注意
在您的Apache服务器配置中创建一个虚拟主机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web站点的。您可以在您的hosts文件中添加这一条目来进行测试,但这种方法仅适用于那些有这些hosts文件的机器来使用。

服务器配置
# 确保Apache在监听80端口
Listen 80

# 为虚拟主机在所有IP地址上监听
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example.com

# 你可以在这里添加其他指令

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example.org

# 你可以在这里添加其他指令

</VirtualHost>

因为星号匹配所有IP地址,所以主服务器不接收任何请求。因为www.example.com首先出现在配置文件中,所以它拥有最高优先级,可以认为是默认或主服务器。这意味着如果一个请求不能与某个ServerName指令相匹配,它将会由第一个<VirtualHost>段所伺服。

注意
如果您愿意,您可以用确定的IP地址来取代"*"。在这种情况下,VirtualHost的参数必须与NameVirtualHost的参数相符:

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# 其他 ...

然而,当您的IP地址无法确定的时候,使用"*"是很方便的,比如说,您的ISP给您配置的是动态IP地址,而您又使用了某种动态域名解析系统时。因为"*"匹配任何IP地址,所以在这种情况下,不论IP地址如何变化,您都不需要另外进行配置。

上述配置就是您在绝大多数情况下使用基于域名的虚拟主机时将要用到的。事实上,仅在一种情况下这样的配置不会让您满意:您想为不同的IP地址或是端口提供不同的内容。


在多于一个IP的情况下使用基于域名的虚拟主机。
注意
在这里讨论的任何技术都可以推广到使用任意数量的IP地址。

服务器有两个IP地址。一个(172.20.30.40)用于主服务器server.domain.com ,另外一个(172.20.30.50)用于构建两个或多个虚拟主机。

服务器配置
Listen 80

# "主"服务器运行于:172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver

# 这是另外一个IP地址
NameVirtualHost 172.20.30.50

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

# 你可以在这里添加其他指令 ...

</VirtualHost>

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

# 你可以在这里添加其他指令 ...

</VirtualHost>

任何不是针对172.20.30.50的请求都将由主服务器来伺服。而提交给172.20.30.50却没有主机名或没有"Host:"头的请求,都将由www.example.com伺服。


在不同的IP的地址(比如一个内部和一个外部地址)上提供相同的内容
服务器有两个IP地址(192.168.1.1和172.20.30.40)。这个机器位于内部(局域网)网络和外部(广域网)之间。在外部,域名server.example.com指向外部地址(172.20.30.40),而在内部则指向内部地址(192.168.1.1)。

服务器可以为来自内部和外部的请求提供同样的内容,您只需要一个<VirtualHost>配置段就可以了。

服务器配置
NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /www/server1
ServerName server.example.com
ServerAlias server
</VirtualHost>

现在,从不同的网络提交的请求都会由同一个<VirtualHost>段来伺服。

注意
在内网中,您可以使用server这个名字来代替server.example.com这个全名。

跟上面一样,在上述的例子里,您可以用"*"来代替具体的IP地址,这样就可以对所有的地址都返回相同的内容了。


在不同的端口上运行不同的站点
如果您想让同一个IP的不同端口伺服多个域名。您可以借助在NameVirtualHost指令中定义端口的方法来达到这个目的。如果您想使用不带"name:port"的<VirtualHost name:port>或是直接用Listen指令,您的配置将无法生效。

服务器配置
Listen 80
Listen 8080

NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080

<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot /www/domain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot /www/domain-8080
</VirtualHost>

<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot /www/otherdomain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>


建立基于IP的虚拟主机
一个有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org的配置如下:

服务器配置
Listen 80

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

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

如果存在主服务器,那么对没有出现在任一个<VirtualHost>段中的请求(比如,对localhost的请求)都会由主服务器来伺服。


混用基于端口和基于IP的虚拟主机
如果您的服务器有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org 。对每个域名,您都希望在80端口和8080端口发布您的网站。您可以这样配置:

服务器配置
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

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

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

<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example.org
</VirtualHost>

<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example.org
</VirtualHost>


混用基于域名和基于IP的虚拟主机
您想在一些地址上配置基于域名的虚拟主机而在另外一些地址上配置基于IP的虚拟主机。

服务器配置
Listen 80

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>

<VirtualHost 172.20.30.40>
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>
DocumentRoot /www/example5
ServerName www.example5.gov
</VirtualHost>


将<Virtual_host>和mod_proxy模块一起使用
下面的例子允许一个前端机器代理一个运行在其他机器上的虚拟主机。在如下示例中,在192.168.111.2机器上配置了一个同名的虚拟主机。这样,万一在同一台机器上代理了多个主机名,ProxyPreserveHost On 指令能确保指定的主机名顺利通过代理。

<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass / http://192.168.111.2
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com
</VirtualHost>


使用"_default_"虚拟主机
为所有端口配置"_default_"虚拟主机
这样配置可以捕获所有指向没指定的IP地址和端口的请求。比如:一个没被任何虚拟主机使用的地址/端口对。

服务器配置
<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>

这样一个使用通配符端口的默认虚拟主机可以有效的防止请求被主服务器接收。

如果一个地址/端口对已经被一个基于域名的虚拟主机使用,那么"_default_"虚拟主机决不会处理发向这个地址/端口对的请求。如果一个"Host:"请求头中包含未知信息,或者干脆就没有,那么它会被第一个基于域名的虚拟主机(也就是在配置文件中最先出现的使用了那个地址/端口对的虚拟主机)处理。

您可以用AliasMatch或RewriteRule来重写任何请求,使它指向一个简单信息页面(或脚本)。

为不同的端口配置"_default_"虚拟主机
与第一种一样,但我们想让服务器侦听很多端口而第二个"_default_"虚拟主机单独侦听80端口。

服务器配置
<VirtualHost _default_:80>
DocumentRoot /www/default80
# ...
</VirtualHost>

<VirtualHost _default_:*>
DocumentRoot /www/default
# ...
</VirtualHost>

侦听80端口的"_default_"虚拟主机(必须出现在所有使用通配符端口的虚拟主机之前)会捕获所有发向一个未指定的IP地址的请求。主服务器将不会用于伺服任何请求。

为单独一个端口配置"_default_"虚拟主机
如果我们只想在80端口上建立唯一的一个"_default_"虚拟主机,我们应该这样配置:

服务器配置
<VirtualHost _default_:80>
DocumentRoot /www/default
...
</VirtualHost>

发向一个未指定地址的80端口的请求将会由这个虚拟主机伺服;而发向未设定地址的其他端口的请求则由主服务器伺服。


将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机
如果一个具有www.example.org域名的虚拟主机(就是基于域名配置示例中的第二个)得到了自己的IP地址。为了避免一些域名服务器或代理服务器在移植期间仍对这个域名做老的解析,我们可以采用一种过渡方法:同时提供新旧两个IP地址的解析。

达到这个目的很简单。因为我们只要简单的把新地址(172.20.30.50)加入VirtualHost指令就行了。

服务器配置
Listen 80
ServerName www.example.com
DocumentRoot /www/example1

NameVirtualHost 172.20.30.40

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

<VirtualHost 172.20.30.40>
DocumentRoot /www/example3
ServerName www.example.net
ServerAlias *.example.net
# ...
</VirtualHost>

现在这个虚拟主机就可以用新地址(表现为一个基于IP的虚拟主机)和旧地址(表现为一个基于域名的虚拟主机)同时进行访问了。


使用ServerPath指令
如果我们在同一个服务器上运行了两个基于域名的虚拟主机。为了匹配正确的虚拟主机,客户端必须发送正确的"Host:"头。而旧的使用HTTP/1.0的客户端无法发送这样的头,这样Apache就无法辨别客户端想要连接哪个虚拟主机(会用主虚拟主机来伺服这个请求)。为了尽量提供向下兼容性,我们可以提供一个主虚拟主机来返回一个页面,在页面中加入指向基于域名的虚拟主机的URL前缀的链接。

服务器配置
NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# 主虚拟主机
DocumentRoot /www/subdomain
RewriteEngine On
RewriteRule ^/.* /www/subdomain/index.html
# ...
</VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /www/subdomain/sub1
ServerName www.sub1.domain.tld
ServerPath /sub1/
RewriteEngine On
RewriteRule ^(/sub1/.*) /www/subdomain$1
# ...
</VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /www/subdomain/sub2
ServerName www.sub2.domain.tld
ServerPath /sub2/
RewriteEngine On
RewriteRule ^(/sub2/.*) /www/subdomain$1
# ...
</VirtualHost>

由于ServerPath指令的作用,发送到http://www.sub1.domain.tld/sub1/的请求总会被sub1-vhost所伺服。
如果客户端发送了正确的"Host:"头,发送到http://www.sub1.domain.tld/的请求只会被sub1-vhost所伺服。如果没有发送"Host:"头,客户端将会得到从主虚拟主机发送的信息页面。

请注意,这里还有一点小问题:如果客户端没有发送"Host:"头,发送到http://www.sub2.domain.tld/sub1/的请求还是会被sub1-vhost所伺服。

RewriteRule指令用以确保正确发送了"Host:"头的客户端可以任意使用这两种URL变量,比如说:使用或不使用URL前缀。

参考自:http://www.phpchina.com/manual/apache/vhosts/examples.html

分类: Php
分享到:
评论

相关推荐

    apache三种虚拟主机的配置

    根据给定文件的信息,本文将详细介绍Apache的三种虚拟主机配置方式:基于名称的虚拟主机(Name-based Virtual Hosts)、基于IP地址的虚拟主机(IP-based Virtual Hosts)以及基于端口的虚拟主机(Port-based Virtual...

    apache虚拟目录和虚拟主机设置详解

    ### Apache虚拟目录和虚拟主机设置详解 #### 一、虚拟目录(Alias) 在Apache服务器配置中,虚拟目录(也称为别名)是一种重要的技术,它允许我们定义一个URL路径,并将其映射到服务器上的实际物理目录。这不仅提高...

    php+apache虚拟主机配置.rar

    在提供的"php+apache虚拟主机配置.txt"文件中,可能包含了更具体的配置步骤或示例,根据实际情况进行参考和调整。总之,配置PHP和Apache的虚拟主机是一个关键的过程,它直接影响到Web应用的性能和可用性。理解并熟练...

    apache配置虚拟主机

    Apache虚拟主机允许通过IP地址、端口或域名来区分不同的站点,从而提高了服务器资源的有效利用和管理效率。在配置过程中,可能会遇到一些常见问题,如虚拟主机冲突和宿主机丢失。下面我们将详细探讨这些问题以及解决...

    本地机apache配置基于域名的虚拟主机

    在IT行业中,Apache HTTP Server是广泛应用的开源Web服务器软件,其强大的功能和灵活性使得它能够支持多种复杂的...在实践中,根据个人需求调整配置,并不断学习和探索,你将能更好地掌握Apache虚拟主机的配置技巧。

    ubuntu 14.04设置Apache虚拟主机的方法.docx

    Ubuntu 14.04 设置 Apache 虚拟主机的方法 在本教程中,我们将学习如何在 Ubuntu 14.04 上设置 Apache 虚拟主机。虚拟主机是一种允许多个域名共享同一个IP地址的技术,它广泛应用于 Web 服务器中。在本教程中,我们...

    apache虚拟主机访问日志配置例子.docx

    Apache虚拟主机访问日志配置是管理服务器日志记录的重要环节,它有助于监控网站流量、分析用户行为以及排查错误。在Linux和Windows系统上,Apache的配置方式有所不同,但核心目标都是为了有效地记录和管理日志文件。...

    Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    ### Ubuntu 16.04与Apache虚拟主机配置详解 #### 前言 随着Linux系统的广泛应用,Apache作为最流行的Web服务器之一,在Ubuntu系统下的配置成为了一项重要的技能。特别是对于那些希望在Ubuntu 16.04系统上搭建多网站...

    apache虚拟主机配置一例

    "Apache虚拟主机配置详解" Apache虚拟主机配置是Apache服务器中的一项重要功能,它允许用户在同一个服务器上...通过了解Apache虚拟主机配置的概念、配置文件和配置示例,我们可以更好地理解和实现Apache虚拟主机配置。

    apache 单ip 虚拟主机 配置

    ### Apache单IP虚拟主机配置详解 #### 一、引言 在互联网服务器管理与部署过程中,经常需要在同一台物理服务器上运行多个独立的网站或应用服务。为了实现这一目标,Apache Web服务器提供了一种名为“虚拟主机”的...

    ubuntu server 10.4下Apache2的三种虚拟主机的实现

    【Apache2 虚拟主机实现】 在 Ubuntu Server 10.04 上,Apache2 提供了多种创建虚拟主机的方法,以满足不同场景的需求。虚拟主机技术允许在一个物理服务器上运行多个独立的网站,各自拥有不同的域名或IP地址,共享...

    apache 设置主机头,同一端口绑定多个域名和网站

    1. **NameVirtualHost**: 在Apache中定义一个名称虚拟主机时,必须先声明`NameVirtualHost`指令。该指令告诉Apache服务器监听哪些端口或IP地址上的请求,并将其与后续的`&lt;VirtualHost&gt;`指令关联起来。 2. **...

    apache 虚拟主机配置技巧

    Apache虚拟主机分为两种主要类型:基于名称的虚拟主机和基于IP的虚拟主机。 **基于名称的虚拟主机:** 这是最常见的配置方式,通过DNS系统将不同的域名映射到同一台服务器的公共IP地址上。Apache通过HTTP请求头中的...

    apache配置虚拟目录

    2. **配置示例**:以下是一个典型的虚拟主机配置示例: ```apache *:80&gt; ServerName www.example.com DocumentRoot /var/www/html/example Allow from all Options +Indexes ``` - **ServerName**:...

    Apache 配置多端口 多虚拟主机 局域网访问示例

    主要介绍了Apache如何配置多端口 多虚拟主机 局域网访问,需要的朋友可以参考下

    Apache + Tomcat + jk配置负载均衡以及虚拟主机 实现多域名、多用户同时使用

    ### Apache + Tomcat + JK配置负载均衡及虚拟主机详解 #### 一、概述 在现代Web应用开发中,为了提高服务器资源的利用率和系统的可扩展性,常常需要在一个物理服务器上部署多个不同的Web应用程序,每个应用程序可能...

Global site tag (gtag.js) - Google Analytics