Apache+php+mysql的安装与配置 - 之三(Apache的虚拟主机配置)

Apache核心(Core)配置

VirtualHost

语法 <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
<VirtualHost>和</VirtualHost>用于封装一组仅作用于特定虚拟主机的指令。配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的请求时,它会使用封装在<VirtualHost>配置段中的指令。Addr可以是:
1.虚拟主机的IP地址
2. 虚拟主机IP地址对应的完整域名
"虚拟主机"是指在一个机器上运行多个网站,比如:www.abc.com和www.ABC.com。如果每个网站拥有不同的IP地址,则虚拟主机可以是"基于IP"的;如果只有一个IP地址,也可以是"基于主机名"的,其实现对最终用户是透明的。
示例:
<VirtualHost 10.1.2.3>
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
</VirtualHost>
每个虚拟主机必须对应不同的IP地址、端口号或是不同的主机名。
在第一种情况下,服务器所在的物理机器必须配置为可以为多个IP地址接受IP包。在机器没有多个网络硬件界面的情况下,如果您的操作系统支持,您可以使用 ifconfig alias 命令来达到这个目的。
注意:<VirtualHost>的使用并不影响Apache的监听地址。你需要使用Listen来确保Apache正在监听正确的地址。

NameVirtualHost 

语法 NameVirtualHost addr[:port]
如果您要配置基于域名的虚拟主机,NameVirtualHost指令就是您必须的指令之一。
尽管addr参数可以使用主机名,但建议您还是使用IP地址。比如:
NameVirtualHost 111.22.33.44
使用NameVirtualHost指令,您可以指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。
另外,您还可以为您使用的基于域名的虚拟主机指定一个端口号。比如:
NameVirtualHost 111.22.33.44:8080
为了接受所有网络接口的请求,您可以使用"*":
NameVirtualHost *
请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全匹配。
NameVirtualHost 1.2.3.4
<VirtualHost 1.2.3.4>
...
</VirtualHost>

基于域名的虚拟主机和基于IP的虚拟主机比较

基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样,你就需要为每个虚拟主机分配一个独立的IP地址。
就像它的名字"基于IP"所暗示的那样,这样的服务器中每个基于IP的虚拟主机必须拥有不同的IP地址。可以通过配备多个真实的物理网络接口来达到这一要求,也可以使用几乎所有流行的操作系统都支持的虚拟界面来达到这一要求(详情请参见您的系统文档,这种功能一般被称作"IP别名",一般用"ifconfig"命令来进行设置)。

而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术,很多虚拟主机可以共享同一个IP地址。
基于域名的虚拟主机相对比较简单,因为你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址,然后配置Apache HTTP服务器,令其辨识不同的主机名就可以了。基于域名的服务器也可以缓解IP地址不足的问题。

所以,如果没有特殊原因使你必须使用基于IP的虚拟主机,您最好还是使用基于域名的虚拟主机。下列情况下,你可能会想要使用基于IP的虚拟主机:
1. SSL协议先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。
2. 一些操作系统和网络设备实现的带宽管理技术无法在多个主机共享一个IP的情况下区别它们。

基于IP地址的虚拟主机

有两种配置方法来使apache支持多主机:为每个虚拟主机运行不同的httpd守护进程;或者用同一个守护进程来支持所有虚拟主机。

设置多个守护进程

为每个虚拟主机创建一个不同的httpd安装。每次安装都在配置文件中使用Listen指令指定守护进程伺服的IP地址(或虚拟主机)。比如:
Listen www.smallco.com:80
建议使用IP地址来取代域名。

配置拥有多个虚拟主机的单一守护进程

在这种情况下,单一的httpd将伺服所有对主服务器和虚拟主机的请求。而配置文件中的VirtualHost指令将为每个虚拟主机配置不同的ServerAdmin, ServerName, DocumentRoot, ErrorLog, TransferLog, CustomLog 。例如:
<VirtualHost www.smallco.com>
ServerAdmin webmaster@mail.smallco.com
DocumentRoot /groups/smallco/www
ServerName www.smallco.com
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
</VirtualHost>

<VirtualHost www.baygroup.org>
ServerAdmin webmaster@mail.baygroup.org
DocumentRoot /groups/baygroup/www
ServerName www.baygroup.org
ErrorLog /groups/baygroup/logs/error_log
TransferLog /groups/baygroup/logs/access_log
</VirtualHost>
建议使用IP地址来取代域名。

使用基于域名的虚拟主机

为了使用基于域名的虚拟主机,你必须指定服务器IP地址(和可能的端口)来使主机接受请求,这个可以用NameVirtualHost指令来进行配置。如果服务器上所有的IP地址都会用到,你可以用"*"作为NameVirtualHost的参数。
请注意,在NameVirtualHost指令中指定IP地址并不会使服务器自动侦听那个IP地址,而必须使用Listen来决定侦听的IP地址和端口。

下一步就是为每个虚拟主机建立<VirtualHost>段。<VirtualHost>的参数与NameVirtualHost的参数必须是一样的(比如说,一个IP地址或"*"代表的所有地址)。在每个<VirtualHost>段中,至少要有一个ServerName指令来指定伺服哪个主机和一个DocumentRoot指令来说明这个主机的内容位于文件系统的什么地方。很多服务器希望自己能通过不只一个域名被访问。我们可以把ServerAlias指令放入<VirtualHost>小节中来解决这个问题。

当然你不能仅仅搞个名字然后把它放到ServerName或ServerAlias里就算完了。你必须先在你的DNS服务器上进行配置,将这些名字和您服务器上的一个IP地址建立映射关系。

这样,当一个请求到达的时候,服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的IP地址。如果能够匹配,它就会查找每个与这个IP地址相对应的<VirtualHost>段,并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。如果找到了,它就会使用这个服务器。否则,将使用符合这个IP地址的第一个列出的虚拟主机。

综上所述,第一个列出的虚拟主机充当了默认虚拟主机的角色。当一个IP地址与NameVirtualHost指令中的配置相符的时候,主服务器中的DocumentRoot将永远不会被用到。所以,如果你想创建一段特殊的配置用于处理不对应任何一个虚拟主机的请求的话,你只要简单的把这段配置放到<VirtualHost>段中,并把它放到配置文件的最前面就可以了。

具体例子

一、在一个IP地址上运行多个基于域名的web站点

您的服务器有只一个IP地址,而在DNS中有很多域名(CNAMES)映射到这个机器。您而您想要在这个机器上运行www.example.com和www.example.org两个站点。
注意:在您的Apache服务器配置中创建一个虚拟主机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web站点的。

  1. # 确保Apache在监听80端口
  2. Listen 80
  3. # 为虚拟主机在所有IP地址上监听
  4. NameVirtualHost *:80
  5. <VirtualHost *:80>
  6. DocumentRoot /www/example1
  7. ServerName www.example.com
  8. # 你可以在这里添加其他指令
  9. </VirtualHost>
  10. <VirtualHost *:80>
  11. DocumentRoot /www/example2
  12. ServerName www.example.org
  13. # 你可以在这里添加其他指令
  14. </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地址。一个(172.20.30.40)用于主服务器server.domain.com ,另外一个(172.20.30.50)用于构建两个或多个虚拟主机。

  1. Listen 80
  2. # "主"服务器运行于:172.20.30.40
  3. ServerName server.domain.com
  4. DocumentRoot /www/mainserver
  5. # 这是另外一个IP地址
  6. NameVirtualHost 172.20.30.50
  7. <VirtualHost 172.20.30.50>
  8. DocumentRoot /www/example1
  9. ServerName www.example.com
  10. # 你可以在这里添加其他指令 ...
  11. </VirtualHost>
  12. <VirtualHost 172.20.30.50>
  13. DocumentRoot /www/example2
  14. ServerName www.example.org
  15. # 你可以在这里添加其他指令 ...
  16. </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>配置段就可以了。

  1. NameVirtualHost 192.168.1.1
  2. NameVirtualHost 172.20.30.40
  3. <VirtualHost 192.168.1.1 172.20.30.40>
  4. DocumentRoot /www/server1
  5. ServerName server.example.com
  6. ServerAlias server
  7. </VirtualHost>

现在,从不同的网络提交的请求都会由同一个<VirtualHost>段来伺服。
注意:在内网中,您可以使用server这个名字来代替server.example.com这个全名。
跟上面一样,在上述的例子里,您可以用"*"来代替具体的IP地址,这样就可以对所有的地址都返回相同的内容了。

四、在不同的端口上运行不同的站点

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

  1. Listen 80
  2. Listen 8080
  3. NameVirtualHost 172.20.30.40:80
  4. NameVirtualHost 172.20.30.40:8080
  5. <VirtualHost 172.20.30.40:80>
  6. ServerName www.example.com
  7. DocumentRoot /www/domain-80
  8. </VirtualHost>
  9. <VirtualHost 172.20.30.40:8080>
  10. ServerName www.example.com
  11. DocumentRoot /www/domain-8080
  12. </VirtualHost>
  13. <VirtualHost 172.20.30.40:80>
  14. ServerName www.example.org
  15. DocumentRoot /www/otherdomain-80
  16. </VirtualHost>
  17. <VirtualHost 172.20.30.40:8080>
  18. ServerName www.example.org
  19. DocumentRoot /www/otherdomain-8080
  20. </VirtualHost>

五、建立基于IP的虚拟主机

一个有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org的配置如下:

  1. Listen 80
  2. <VirtualHost 172.20.30.40>
  3. DocumentRoot /www/example1
  4. ServerName www.example.com
  5. </VirtualHost>
  6. <VirtualHost 172.20.30.50>
  7. DocumentRoot /www/example2
  8. ServerName www.example.org
  9. </VirtualHost>

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

六、混用基于端口和基于IP的虚拟主机

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

  1. Listen 172.20.30.40:80
  2. Listen 172.20.30.40:8080
  3. Listen 172.20.30.50:80
  4. Listen 172.20.30.50:8080
  5. <VirtualHost 172.20.30.40:80>
  6. DocumentRoot /www/example1-80
  7. ServerName www.example.com
  8. </VirtualHost>
  9. <VirtualHost 172.20.30.40:8080>
  10. DocumentRoot /www/example1-8080
  11. ServerName www.example.com
  12. </VirtualHost>
  13. <VirtualHost 172.20.30.50:80>
  14. DocumentRoot /www/example2-80
  15. ServerName www.example.org
  16. </VirtualHost>
  17. <VirtualHost 172.20.30.50:8080>
  18. DocumentRoot /www/example2-8080
  19. ServerName www.example.org
  20. </VirtualHost>

七、混用基于域名和基于IP的虚拟主机

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

  1. Listen 80
  2. NameVirtualHost 172.20.30.40
  3. <VirtualHost 172.20.30.40>
  4. DocumentRoot /www/example1
  5. ServerName www.example.com
  6. </VirtualHost>
  7. <VirtualHost 172.20.30.40>
  8. DocumentRoot /www/example2
  9. ServerName www.example.org
  10. </VirtualHost>
  11. <VirtualHost 172.20.30.40>
  12. DocumentRoot /www/example3
  13. ServerName www.example3.net
  14. </VirtualHost>
  15. # IP-based
  16. <VirtualHost 172.20.30.50>
  17. DocumentRoot /www/example4
  18. ServerName www.example4.edu
  19. </VirtualHost>
  20. <VirtualHost 172.20.30.60>
  21. DocumentRoot /www/example5
  22. ServerName www.example5.gov
  23. </VirtualHost>

Apache+php+mysql的安装与配置 - 之三(Apache的虚拟主机配置)的更多相关文章

  1. Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解

    文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...

  2. ubuntu apache2配置详解(含虚拟主机配置方法)

    ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...

  3. ubuntu下安装配置apache2(含虚拟主机配置)

    在Ubuntu14.14中安装apache 安装指令: sudo apt-get install apache2 安装结束后: 产生的启动和停止文件是: /etc/init.d/apache2 启动: ...

  4. Apache和mysql的安装设置

    Apache和mysql的安装较简单,主要是安装前请保证80端口未被占用 比如 iis 以前安装过的apache mysql 先停止运行phpmyadmin,主要是配置文件的问题,把phpMyAdmi ...

  5. Apache虚拟主机配置

    在一个Apache服务器上可以配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录.Apache虚拟主机配置有3中方法:基于IP配置.基于域名配置和基于端口配置,这里介 ...

  6. phpStudy 2014的Apache虚拟主机配置

    安装phpStudy直接百度下载,傻瓜式安装很简单,一直点击下一步即可,中途根据个人爱好设置WWW目录,我的设置在D盘根目录里. 打开虚拟主机配置,打开D:\phpStudy\Apache\conf下 ...

  7. linux apache虚拟主机配置(基于ip,端口,域名)

    配置环境: linux版本:Centos6.4 httpd版本: [root@centos64Study init.d]# pwd/etc/init.d[root@centos64Study init ...

  8. windows环境下,apache虚拟主机配置

    在windows环境下,apache从配置文件的相关配置: Windows 是市场占有率最高的 PC 操作系统, 也是很多人的开发环境. 其 VirtualHost 配置方法与 Linux 上有些差异 ...

  9. Linux Apache虚拟主机配置方法

    apache 虚拟主机配置 注意: 虚拟主机可以开很多个 虚拟主机配置之后,原来的默认/etc/httpd/httpd.conf中的默认网站就不会生效了 练习: 主机server0 ip:172.25 ...

随机推荐

  1. apache无法启动解决办法

    最近我的Apache老是无法启动 查看端口是否被占用? 这些方法网上一大堆,终于有一个能解决我的问题,赶紧摘抄下来,方便自己使用! 1.win+R,输入cmd, 2.进入命令行界面输入[netstat ...

  2. VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)

    原文:VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connec ...

  3. Thread suspend()挂起resume()恢复

    import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...

  4. 啥叫sched-domain

    这周问过公司里专家,说cpu-load是说CPU的计算能力,但是从代码实在不知道cpu-load说的是啥! SD_SHARE_CPUPOWER 0X8000  domain的成员共享cpu power ...

  5. 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并

    题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...

  6. 【bzoj4419】[Shoi2013]发微博 STL-set

    题目描述 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x   表示用户x发了一条微博: + x y 表示用户x和用户y成为了好友 ...

  7. 【bzoj2038】[2009国家集训队]小Z的袜子(hose) 莫队算法

    原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...

  8. 【bzoj4562】[Haoi2016]食物链 拓扑排序+dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832118.html 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动 ...

  9. [poj] 1236 networks of schools

    原题 这是一道强连通分量板子题. 显然subtask1 是要输出入度为0的点的个数 而subtask2,我们考虑一下最优一定是把一个出度为零的点连到入度为零的点上,这样我们要输出的就是max(出度为零 ...

  10. Dom的深度优先遍历和广度优先遍历

    //深度优先遍历的递归写法 function DFTraversal(node) { var nodes = []; if (node != null) { nodes.push(node); var ...