(ps:很多天前就已经看了这一章节,但是由于各种事,没有整理和回顾,也没有时间去看新书或者写写代码什么的,之前一直没有搞明白一个机器上怎么样放置多个网站,觉得这个东西很神奇,现在看了这一章也清楚了,不觉得神奇了)
随着web的发展,每个人都想要一个网站,但是很少有人有能力或者时间来搭建带空调房的服务器机房,注册域名,或购买网络带宽。对应着这种需求出现了专业化的web主机托管服务,服务级别有很多种,托管者出租服务和网站管理业务,并提供不同程度的安全级别、报告及易用性。许多web托管者通过让一些顾客共享一台计算机来提供便宜的web主机托管服务,这称为共享主机或者虚拟主机托管。每个网站看起来是托管在不同的服务器上,但是实际上托管在同一个物理服务器上。那么这样会出现一个问题如果让我们去管理这一样台设备,怎么样去把域名对应相应的ip再对应到相应的web目录下?(本文讨论怎么样去解决上述问题,不过多涉及怎么样搭建虚拟主机,在文章最后给出搭建方法的参考)
在HTTP/1.0中有一个设计缺陷会让虚拟主机托管者抓狂。HTTP/1.0规范中没有为共享的web服务器提供任何方法来识别要访问的是那个虚拟网站。在HTTP/1.0请求在报文中只发送了url的路径部分。如果要访问http://www.xxx.com/index.html,浏览器会发送连接到服务器www.xxx.com,但是HTTP/1.0请求中只提到GET /index.html,没有提到主机名。如果服务器托管了多个站点,就没以有足够的信息来标识一哪个虚拟网站 。
缺失主机信息是原始HTTP规范的疏忽,它错误的假设每个web服务器上只托管了一个网站。在这个期间涌现了以下4种技术来解决这个问题。
(1)通过URL路径进行虚拟主机托管
在url中添加专门的路径部分,以便服务器判断是哪个网站。
(2)通过端口号进行主机托管
为每个站点分配一个端口号。
(3)通过IP地址进行主机托管
为不同的虚拟站点分配专门的ip地址,把这些地址绑定到一台单独的机器上。
(4)通过Host首部进行主机托管
通过Htpp/1.0增强版和HTTP/1.1正式版定义Host请求首部来携带网站名称。
通过URL路径进行虚拟主机托管
通过分配不同的url路径,把共享服务器上的虚拟站点隔离开。
如:
当请求到达服务时,其中并没有主机信息,但是服务器可以通过路径来区分它们。请求zyt的网址是:GET /zyt/index.html,请求icrt的网址是: GET /icrt/index.html 这不是一个好办法/zyt 和/icrt是多余的,更坏的是http://www.xx123.com和http://www.xx356.com不能用了。
这种方案在实际中很少会用到。
通过端口号进行主机托管
可在在web服务器上为不同网站指定不同的端口号,不再使用80端口,而是采用其它端口号。这个解决方案也有问题:终端用户不乐意在url中指定非标准的端口号。如http://www.xx123.com:89
通过IP地址进行主机托管
通过ip地址进行主机托管,是一个更常用、更好的办法。为每个虚拟网站分配一个或者多个唯一的ip地址。所有虚拟网站的ip地址都绑定到同一个共享服务器上。服务器可以查询http连接的目的ip地址,并以此来判断客户端的目标网站。
如:把ip:209.173.34.3分配给www.xxx123.com,把ip:209.172.34.2分配给www.xx356.com,把这两个ip地址都绑定到同一物理服务器上。
但是这样做也会带来一些麻烦:
首先在计算机系统上能够绑定的虚拟ip地址通常是有限制的,其次ip地址是稀缺资源,最后托管都通过复制服务器来增加容量时,ip地址短缺的问题就更加严重了。
尽管有这样的缺陷,但是它仍然得到广泛的应用。
通过Host首部进行主机托管
为了避免过度的地址消耗和虚拟ip地址的限制,我们希望在虚拟站点间共享同一个ip地址,且仍然能够区分站点。为了解决这个问题,浏览器来服务器的实现都扩展了HTTP,把原始主机名给了服务器。不过,浏览器不能只发送完整的URL,因为这会使许多只能接收路径的服务器无法工作。替代的方法是,把主机名和端口号放在所请求的Host扩展首部中传送。
绝大多数现代浏览器和服务器都支持Host首部,但仍然有一些客户端以及网络机器人不支持它。
虚拟主机搭建:
apache可以参考:《Apache管理员手册》第七章或者apache官方手册
nginx可以参考:《Nginx取代Apache的高性能web服务器》第3章或者Nginx官方手册