Apache+php+mysql的安装与配置

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站点的。

[html] view plaincopy
 
  1. # 确保Apache在监听80端口  
  2. Listen 80  
  3.   
  4. # 为虚拟主机在所有IP地址上监听  
  5. NameVirtualHost *:80  
  6.   
  7. <VirtualHost *:80>  
  8. DocumentRoot /www/example1  
  9. ServerName www.example.com  
  10. # 你可以在这里添加其他指令  
  11. </VirtualHost>  
  12.   
  13. <VirtualHost *:80>  
  14. DocumentRoot /www/example2  
  15. ServerName www.example.org  
  16. # 你可以在这里添加其他指令  
  17. </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)用于构建两个或多个虚拟主机。

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

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

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

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

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

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

一个有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org的配置如下:
[html] view plaincopy
 
  1. Listen 80  
  2.   
  3. <VirtualHost 172.20.30.40>  
  4. DocumentRoot /www/example1  
  5. ServerName www.example.com  
  6. </VirtualHost>  
  7.   
  8. <VirtualHost 172.20.30.50>  
  9. DocumentRoot /www/example2  
  10. ServerName www.example.org  
  11. </VirtualHost>  
如果存在主服务器,那么对没有出现在任一个<VirtualHost>段中的请求(比如,对localhost的请求)都会由主服务器来伺服。

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

如果您的服务器有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org 。对每个域名,您都希望在80端口和8080端口发布您的网站。您可以这样配置:
[html] view plaincopy
 
  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.   
  6. <VirtualHost 172.20.30.40:80>  
  7. DocumentRoot /www/example1-80  
  8. ServerName www.example.com  
  9. </VirtualHost>  
  10.   
  11. <VirtualHost 172.20.30.40:8080>  
  12. DocumentRoot /www/example1-8080  
  13. ServerName www.example.com  
  14. </VirtualHost>  
  15.   
  16. <VirtualHost 172.20.30.50:80>  
  17. DocumentRoot /www/example2-80  
  18. ServerName www.example.org  
  19. </VirtualHost>  
  20.   
  21. <VirtualHost 172.20.30.50:8080>  
  22. DocumentRoot /www/example2-8080  
  23. ServerName www.example.org  
  24. </VirtualHost>  

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

您想在一些地址上配置基于域名的虚拟主机而在另外一些地址上配置基于IP的虚拟主机。
[html] view plaincopy
 
  1. Listen 80  
  2.   
  3. NameVirtualHost 172.20.30.40  
  4.   
  5. <VirtualHost 172.20.30.40>  
  6. DocumentRoot /www/example1  
  7. ServerName www.example.com  
  8. </VirtualHost>  
  9.   
  10. <VirtualHost 172.20.30.40>  
  11. DocumentRoot /www/example2  
  12. ServerName www.example.org  
  13. </VirtualHost>  
  14.   
  15. <VirtualHost 172.20.30.40>  
  16. DocumentRoot /www/example3  
  17. ServerName www.example3.net  
  18. </VirtualHost>  
  19.   
  20. # IP-based  
  21. <VirtualHost 172.20.30.50>  
  22. DocumentRoot /www/example4  
  23. ServerName www.example4.edu  
  24. </VirtualHost>  
  25.   
  26. <VirtualHost 172.20.30.60>  
  27. DocumentRoot /www/example5  
  28. ServerName www.example5.gov  
  29. </VirtualHost>  
原文地址:https://www.cnblogs.com/geniusxjq/p/4092586.html