访问web服务,本质上看(从协议上)是访问某个IP的主机上的某个端口(默认是80)
通常需要通过访问不同的域名或者端口实现对不同网站的访问(具体到服务器里就是不同目录),这个时候就需要设置虚拟主机(VirtualHost).通常分为这样3种:
基于域名,基于端口,基于IP,以及它们的混合
准备工作:
在apache的主目录/var/www/html/下分别建立四个文件夹s1,s2,s3,s4,在里面建立不同网站的主页文件,如s1下面建立index.html内容为this is s1, s2下面建立index.html内容为this is s2,依此类推.
配置server的bind服务,为它添加2个域名s1.domain1.com, s2.domain1.com,.(其实是完全按我之前写的DNS设置的文章配的,只做了小小的改动而已)将客户机的DNS指向server,在客户机上ping 这2个域名都能返回正确的IP.
另外注意一点:每次修改配置文件httpd.conf之后apache要重新启动,才能使配置生效
下面是每种虚拟主机的配置过程
1.基于域名
这是一种最通用的情况,已经给服务器设置了多个域名,然后希望访问不同的域名来访问不同的网站文件.
修改httpd.conf的配置
# Use name-based virtual hosting.
#
NameVirtualHost * 表示在apache监听的所有IP和所有端口(此时只有80)上做多域名虚拟主机
<VirtualHost *>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s1
ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *>
ServerAdmin xxx@ixxx.com
DocumentRoot /var/www/html/s2
ServerName s2.domain1.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
测试虚拟主机配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:* is a NameVirtualHost
default server s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1066)
port * namevhost s1.domain1.com (/usr/local/apache2/conf/httpd.conf:1066)
port * namevhost s2.domain1.com (/usr/local/apache2/conf/httpd.conf:1075)
Syntax OK
说明语法没问题,然后在测试机*问这两个域名:s1.domain1.com和s2.domain1.com可以看到各自的页面
问题:如果以IP访问,看到的是什么?
是s1的页面,注意上面的这段话
*:* is a NameVirtualHost
default server s1.domain1.com
意思十分明显,我们在*:*(apache监听的任意IP任意端口上)做了多域名虚拟主机,而s1.domain1.com是这个缺省的服务器.也就是说访问*:*,除非访问的是我们设置的域名,否则默认会转向到s1.domain1.com.
2.基于端口
通过访问同一个IP(或者域名)的不同端口来访问到不同的文件
对httpd.conf做如下修改
增加监听口
Listen 80
Listen 81
将之前做的多域名虚拟主机去掉(因为此时是用IP加端口来访问的),即
# Use name-based virtual hosting.
#
# NameVirtualHost * 注释掉这句话
以下是虚拟主机配置(注意下面的配置部分我并没用ServerName字段)
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s1
ErrorLog logs/error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s2
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
验证虚拟主机配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1065)
*:81 192.168.0.111 (/usr/local/apache2/conf/httpd.conf:1074)
Syntax OK
在客户端通过访问IP:80和IP:81看到不同页面
混合实验
看到这里我们就可以做一个稍微复杂的实验,在不同的端口上做不同域名的访问.例如
在80*问s1.domain1.com和s2.domain1.com
在81*问s3.domain2.com和s4.domain2.com当然这样访问是要带端口号的,上面因为是80默认端口所以不需要写端口号
访问这四个域名+端口分别访问到不同的页面.
配置过程
首先在bind上增加两个域名指向服务器. s3.domain2.com,s4.domain2.com,增加之后记得要重启bind.
然后修改httpd.conf文件
增加监听口
Listen 80
Listen 81
虚拟主机设置
# Use name-based virtual hosting.
#
NameVirtualHost *:80
NameVirtualHost *:81
表示要在本机的所有IP的80和81上面做多域名(NameVirtualHost:即为名称虚拟主机的意思)
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s1
ServerName s1.domain1.com
ErrorLog logs/ error_log
TransferLog logs/ access_log
</VirtualHost>
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s2
ServerName s2.domain1.com
ErrorLog logs/ error_log
TransferLog logs/access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s3
ServerName s3.domain2.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
<VirtualHost *:81>
ServerAdmin xxx@xxx.com
DocumentRoot /var/www/html/s4
ServerName s4.domain2.com
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
原文地址:http://hi.baidu.com/lenvol/blog/item/0bbb6f624bfe63ce8db10d90.html