VirtualHost举例

Apache 2.0 version

下面的例子都是在一个服务器上运行多个站点的情况,基于name-based或者IP-based virtual host

单IP,单PORT,多域名,Name-based web sites

来自作者的警告:在你的Apache服务器上配置虚拟主机文件并不能神奇的让DNS为你创建这些主机名。你必须在DNS服务器里将主机名与你的服务器IP关联!或者仅仅修改你客户机的host文件也可以,不过这个方法只能让被修改的机器识别。

Server configuration


# 监听80端口
Listen 80

# 为虚拟主机请求监听所有IP
NameVirtualHost *:80

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

# Other directives here

</VirtualHost>

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

# Other directives here

</VirtualHost>

www.example1.com最先出现在这个配置文件里,具有最高优先级。你可以将其视为默认服务器或者主要服务器。如果一个接收的请求没有匹配到任何ServerName,那么这个请求将被第一个VirtualHost处理。

你也可以配置具体的ip来替换,那样VirtualHost的参数必须匹配NameVirtualHost。但是,在IP地址不可预知的系统上使用也是有用的,例如,如果您的ISP有动态IP地址,并且您正在使用各种动态DNS解决方案。 由于*匹配任何IP地址,因此只要您的IP地址发生更改,此配置就可以在不更改的情况下运行

多IP,Name-based hosts

两个IP

Server configuration


Listen 80

# This is the "main" server running on 172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver

# This is the other address
NameVirtualHost 172.20.30.50

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

# Other directives here ...

</VirtualHost>

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

# Other directives here ...

</VirtualHost>

多IP,同服务

服务器主机有两个IP:192.168.1.1,172.20.30.50.

机器的两个网卡分别接内网和外网。外网口使用172.20.30.50,使用域名server.example.com,内网口使用192.168.1.1。

服务器对于内网和外网的请求使用相同的内容响应,只使用一个VirtualHost。

Server configuration

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>

据介绍,用*替换ip地址列表也可以达到同样的目的<VirtualHost *>

单IP,多端口,多服务

如果你使用<VirtualHost name:port>的同时不使用NameVirtualHost name:port或者你使用Listen指令,你的配置将无法生效,NameVirtualHost特指基于域名的访问情况

Server configuration

Listen 80
Listen 8080

NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080

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

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

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

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

配置很多,但是逻辑很简单

四个服务:

  • domain-80
  • domain-8080
  • otherdomain-80
  • otherdomain-8080

但是只有一个IP,于是表演了用2个端口,2个域名排列组合共设置了4个虚拟主机,不要忘记了Listen和NameVirtualHost

IP-based virtual hosting

两个IP(172.20.30.40和172.20.30.50),

Server configuration

Listen 80

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

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

port-based和ip-based virtual hosts混用

Server configuration

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.example1.com
</VirtualHost>

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

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

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

又是排列组合的问题,不过令我感到奇怪的是,没有使用<NameVirtualHost>,猜测可能是由于ip和port的排列组合,不采用基于域名的方案,因此没用这个指令。

name-based和IP-based vhosts混用

Server configuration

Listen 80

NameVirtualHost 172.20.30.40

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

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

NameVirtualHost 172.20.30.40指定了前三个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_

捕获未指定IP和port的请求

Server configuration

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

将基于名称的虚拟主机迁移到基于IP的虚拟主机

Server configuration

Listen 80
ServerName www.example1.com
DocumentRoot /www/example1

NameVirtualHost 172.20.30.40

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

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

主机名为www.example2.org的基于名称的虚拟主机(来自我们基于名称的示例setup 2)应该有自己的IP地址。 为了避免名称服务器或代理缓存基于名称的虚拟主机的旧IP地址的问题,我们希望在迁移阶段提供两种变体。
解决方案很简单,因为我们可以简单地将新的IP地址(172.20.30.50)添加到VirtualHost指令中。

ServerPath

我们有一个服务器与两个基于名称的虚拟主机。 为了匹配正确的虚拟主机,客户端必须发送正确的主机:标头。 旧的HTTP / 1.0客户端不会发送这样的头文件,Apache不知道客户端试图访问哪个虚拟主机(并且从主虚拟主机提供请求)。 为了提供尽可能多的向后兼容性,我们创建一个主要的虚拟主机,它返回一个包含带有URL前缀的链接的单个页面到基于名称的虚拟主机。

Server configuration

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# primary vhost
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指令,对URL http://www.sub1.domain.tld/sub1/的请求总是从sub1-vhost提供。
如果客户端发送了正确的主机:标头,则仅向sub1-vhost提供对URL http://www.sub1.domain.tld/的请求。 如果没有发送主机:头部,客户端从主要主机获取信息页面。
请注意,有一个奇怪的情况:如果客户端没有发送Host:头,则也会从sub1-vhost提供对http://www.sub2.domain.tld/sub1/的请求。
RewriteRule指令用于确保发送正确Host:标头的客户端可以使用两种URL变体,即带或不带URL前缀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,586评论 2 57
  • //////////2017-1-10 ~ 2017-1-15/////////// int study_data...
    javaMonkey阅读 457评论 0 0
  • 1. 概述 在网络环境中一般用户只需要在浏览器中输入url如www.sunny.com就可以到对应服务器获取相应的...
    ghbsunny阅读 2,865评论 0 7
  • DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能...
    一直在努力hard阅读 4,606评论 3 19
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,985评论 0 9