5月阅读周·HTTP权威指南:Web主机托管之设法让虚拟主机托管正常工作篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
Web主机托管
当你把资源放在公共的Web服务器上时,因特网社区就可以使用它们了。这些资源可以是简单的文本文件或图像,也可以是复杂的实时导航地图或电子商务购物网关。能够将这些由不同组织拥有的种类繁多的资源便利地发布到网站上,并将其放置在能以合理价格提供很好性能的Web服务器上,是很关键的。
对内容资源的存储、协调以及管理的职责统称为Web主机托管。主机托管是Web服务器的主要功能之一。保存并提供内容,记录对内容的访问以及管理内容都离不开服务器。如果不想自行管理服务器所需的软硬件,就需要主机托管服务,即托管者。托管者出租服务和网站管理维护业务,并提供各种不同程度的安全级别、报告及易用性。托管者通常把很多网站放在一些强大的Web服务器上联合运行,这样可以获得更高的成本效益、可靠性和性能。
设法让虚拟主机托管正常工作
缺失的主机信息是原始HTTP规范的疏忽,它错误地假设了每个Web服务器上只托管了一个网站。HTTP的设计者没有为进行虚拟主机托管的共享服务器提供支持。正因为如此,URL中的主机名信息被当作冗余信息剥离了,只要求发送路径部分。
因为早期的规范没有考虑到虚拟主机托管,Web托管者需要开发变通的方案和约定来支持共享的虚拟主机托管。这个问题本可以通过要求所有HTTP请求报文发送完整的URL而不只是路径部分来简单地解决。而HTTP/1.1的确要求服务器能够处理HTTP报文请求行上的完整URL,但将现存的应用程序都升级到这个规范还需要很长时间。在此期间,涌现了以下4种技术。
接下来详细介绍每种技术。
通过URL路径进行虚拟主机托管
可以通过分配不同的URL路径,用这种笨方法把共享服务器上的虚拟站点隔离开。例如,可以给每个逻辑网站一个专门的路径前缀。
- Joe的五金商店可以是:http://www.index.com/joe/index.html。
- Mary的古董拍卖店可以是:http://www.index.com/mary/index.html。当请求到达服务器时,其中并没有主机名信息,但服务器可以通过路径来区分它们。
- 请求Joe的五金商店的网址是GET /joe/index.html。
- 请求Mary的古董拍卖店的网址是GET /mary/index.html。
这不是一个好办法。/joe和/mary这样的前缀是多余的(主机名中已经提到joe了)。更糟的是,描述主页链接的常见约定:http://www.index.com或http://www.index.com/index.html都不能用了。
总之,按URL来进行虚拟主机托管是一个糟糕的解决方案,很少会用到。
通过端口号进行虚拟主机托管
除了修改路径名,还可以在Web服务器上为Joe和Mary的网站分配不同的端口号。不再使用端口80,而是采用其他端口号,例如,Joe用82 Mary,用83。但这个解决方案也有同样的问题:终端用户不会乐意在URL中指定非标准的端口号。
通过IP地址进行虚拟主机托管
一个更常用的、更好的方法是通过IP地址进行虚拟化。每个虚拟网站都分配一个或多个唯一的IP地址。所有虚拟网站的IP地址都绑定到同一个共享的服务器上。服务器可以查询HTTP连接的目的IP地址,并以此来判断客户端的目标网站。
比方说,托管者把IP地址209.172.34.3分配给www.index.com@@,把IP地址209.172.34.4分配给www.index.com,把这两个IP地址都绑定到同一个物理服务器上。Web服务器就能使用目的IP地址来识别用户请求的是哪个虚拟站点了。
- 客户端A获取http://www.index.com/index.html。
- 客户端A查询www.index.com的IP地址,得到209.172.34.3。
- 客户端A打开到共享服务器的TCP连接,目的地址是209.172.34.3。
- 客户端A发送请求,内容为GET /index.html HTTP/1.0。
- 在Web服务器提供响应之前,它注意到实际的目的IP地址(209.172.34.3),判断出这是Joe的五金网站的虚拟IP地址,就根据子目录/joe来完成请求。返回的是文件/joe/index.html。类似地,如果客户端B请求http://www.index.com/index.html。
- 客户端B查询www.marys-antiques.com的IP地址,得到209.172.34.4。
- 客户端B打开到Web服务器的TCP连接,目的地址是209.172.34.4。
- 客户端B发送请求,内容是GET /index.html HTTP/1.0。
- Web服务器判断出209.172.34.4是Mary的网站,根据/mary目录来完成请求,返回的是文件/mary/index.html。对大的托管者来说,虚拟IP的主机托管能够工作,但它会带来一些麻烦。
- 在计算机系统上能绑定的虚拟IP地址通常是有限制的。想在共享的服务器上托管成百上千的虚拟站点的服务商不一定能实现愿望。
- IP地址是稀缺资源。有很多虚拟站点的托管者不一定能为被托管的网站获取足够多的IP地址。
- 托管者通过复制服务器来增加容量时,IP地址短缺的问题就更严重了。随负载均衡体系的不同,可能会要求每个复制的服务器上有不同的虚拟IP地址,因此IP地址的需求量可能会随复制服务器的数量而倍增。
尽管虚拟IP的主机托管存在消耗地址的问题,但它仍然得到了广泛的运用。
通过Host首部进行虚拟主机托管
为了避免过度的地址消耗和虚拟IP地址的限制,我们希望在虚拟站点间共享同一个IP地址,且仍能区分站点。但正如我们看到的那样,因为大多数浏览器只是把URL的路径发给服务器,关键的虚拟主机名信息被其丢掉了。
为了解决这个问题,浏览器和服务器的实现者扩展了HTTP,把原始的主机名提供给服务器。不过,浏览器不能只发送完整的URL,因为这会使许多只能接收路径的服务器无法工作。替代的方法是,把主机名(和端口号)放在所有请求的Host扩展首部中传送。
客户端A和客户端B都发送了携带有要访问的原始主机名的Host首部。当服务器收到对/index.html的请求时,可以通过Host首部来判断要使用哪个资源。
Host首部最早是在HTTP/1.0+中引入的,它是开发商实现的HTTP/1.0的扩展超集。遵循HTTP/1.1标准则必须支持Host首部。绝大多数现代浏览器和服务器都支持Host首部,但仍有一些客户端和服务器(以及网络机器人)不支持它。
总结
设法让虚拟主机托管正常工作主要有以下4种技术:
- 通过URL路径进行虚拟主机托管:在URL中增添专门的路径部分,以便服务器判断是哪个网站。
- 通过端口号进行主机托管:为每个站点分配不同的端口号,这样请求就由Web服务器的单独实例来处理。
- 通过IP地址进行主机托管:为不同的虚拟站点分配专门的IP地址,把这些地址都绑定到一台单独的机器上。这样,Web服务器就可以通过IP地址来识别网站名了。
- 通过 Host首部进行主机托管:很多Web托管者向HTTP的设计者施压,要求解决这个问题。HTTP/1.0的增强版和HTTP/1.1的正式版定义了Host请求首部来携带网站名称。Web服务器可以通过Host首部识别虚拟站点。可以通过Host首部识别虚拟站点。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)