一、概述
从零开始构建一个真正意义的网站需要做很多事情,包括购买计算机硬件、建造机房、注册域名、购买网络带宽、开发Web服务器软件、管理网站内容等等。在互联网发展的早期,构建网站的这一系列动作通常都是由单个组织独自完成的。
在互联网已成主流的今天,很多人都想拥有一个自己的网站,但很少人具备构建网站的技能或时间。这一多一少的反差,直接催生了大量专业的机构和公司,它们根据用户(个人或企业)需求程度的不同,提供不同级别的网站构建服务:从仅仅提供硬件设施,到提供全站式服务(此时用户只需要提供网站内容即可)。
这些构建网站所需的一系列动作统称为Web托管(Web Hosting),而那些提供Web托管服务(Web Hosting Services)的机构和公司则称为Web托管服务提供商(Hoster)。
共享Web托管分为专用托管(又称专用主机,Dedicated Hosting)和虚拟托管(又称虚拟主机,Virtual Hosting)两种方式。
二、专用主机
在专用主机中,一个网站独占一个Web服务器。
不同网站使用不同的Web服务器,而不同Web服务器具有不同的因特网IP地址,因此用户对不同网站的访问完全是相互独立的。
三、虚拟主机
在虚拟主机中,多个网站共享同一个Web服务器。
1. 缺乏主机信息的问题(Virtual Server Request Lacks Host Information)
例如两个网站A(域名为http://www.a.com)和B(域名为http://www.b.com)共享同一个Web服务器H(从而DNS服务器会将A和B的域名映射到同一个因特网IP地址),则用户访问站点A或B时,最终都会把请求发给同一个Web服务器实体:
- 访问http://www.a.com/index.html时,含有“GET /index.html”的HTTP请求将会被发给Web服务器H
- 访问http://www.b.com/index.html时,含有“GET /index.html”的HTTP请求将会被发给Web服务器H
显然,当Web服务器H收到同样的“GET /index.html”请求时,并没有足够的信息让它判断被访问的站点到底是A还是B。
问题的关键就在于HTTP请求中不包含主机信息。由于HTTP/1.0在设计之初认为一个Web服务器只会托管一个网站(即专用主机的应用场景),所以去掉了URL中稍显冗余的主机名(hostname),导致HTTP请求的URL中就只含有路径部分(path component)。HTTP/1.0的这种假设和处理显然无法应付虚拟主机的应用场景,
2. 让虚拟主机正常工作(Making Virtual Hosting Work)
为了解决上述问题,以下四种技术方案(workarounds)应运而生:
- 添加特殊的URL路径(URL path)
给不同站点添加不同的路径前缀。例如对于站点A:原来的http://www.a.com/index.html变成了http://www.a.com/a/index.html,对应的URL请求则变成了“GET /a/index.html”;对于站点B:原来的http://www.b.com/index.html变成了http://www.b.com/b/index.html,对应的URL请求则变成了“GET /b/index.html”。
缺点:1)主机名www.a.com中有“a”,路径中也有“a”,既显得冗余又让人迷惑;2)访问站点的一般规则被打破了,输入http://www.a.com或http://www.a.com/index.html无法访问该站点的首页。
- 指定不同的端口号
给不同站点指定不同的端口号。例如站点A使用80端口,站点B使用82端口。
缺点:打破了HTTP协议的默认端口号是80的规则,可以想象用户不能通过http://www.b.com甚至http://www.b.com:80访问站点B,却必须使用http://www.b.com:82时会有多么恼火。
- 指定不同的IP地址
Web服务器上绑定多个IP地址,并给不同站点指定不同的IP地址。例如网站A使用209.172.34.3,网站B使用209.172.34.4。当用户访问http://www.a.com时,经过域名解析后,实际会与209.172.34.3建立TCP链接,并发起HTTP请求,Web服务器就可以根据目的IP(209.172.34.3)来识别出被访问的站点(即网站A);类似地,用户访问http://www.b.com时,Web服务器发现目的IP为209.172.34.4,从而得知被访问是站点B。
缺点:1)Web服务器所在的单个计算机通常只能绑定有限个数的IP地址,如果一个Web服务器打算托管成百上千的站点,那就只能打消这个算盘了;2)因特网的IP地址是个昂贵而又稀缺的资源,使用过多的IP地址很烧钱并且还不只是钱的问题。
- 协议新增支持主机头部(Host headers)
在HTTP/1.0+中扩展引入了主机头部(Host headers),在HTTP/1.1中更是明确规定了HTTP请求中需要包含主机头部(Host headers)。主机头部给出被访问的站点或资源所在的因特网主机名和端口号:Host = "Host" ":" host [ ":" port ]
例如访问站点A(http://www.a.com/index.html)的HTTP请求如下:
GET /index.html HTTP/1.1
User-Agent: SuperBrowser v1.3 Host: www.a.com访问站点B(http://www.b.com/index.html)的HTTP请求如下:
GET /index.html HTTP/1.1
User-Agent: WebSurfer 2000 Host: www.b.com:80缺点:无。此为终极方案。
四、更可靠的网站(Making Web Sites Reliable)
1. 服务器集群(Server Farm or Server Cluster)
服务器集群是指大量内容相同、功能等效、相互可替换的Web服务器。(相关定义可参考)
服务器集群中的服务器一般分为主服务器(Master servers or Primary servers)和备份服务器(Replica servers or Backup servers)。主服务器故障时,备份服务器可以作为替换,主/备服务器与负载均衡器(Load balancer)一起配合可以实现负载均衡(Load balancing)。
服务器集群中的主/备服务器可以部署在同一个位置(集中式),也可以分布在不同的地方(分布式)。集中式的主/备服务器之间的互连和切换通常由交换机(Network switch)来完成;分布式的主/备服务器由互联网连接,相互之间的切换可以通过HTTP重定向(HTTP redirection)或DNS重定向(DNS redirection)来实现。
2. 内容分布式网络(Content Distribution Network, CDN)
内容分布式网络的应用有反向代理缓存服务器(Surrogate Cache)和代理缓存服务器(Proxy Cache)等。(相关定义可参考和)