一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。

用单台虚拟主机实现多个域名

HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。即使物理层面只有一台服务器,但可以使用虚拟主机的功能,则可以假相已具有多台服务器。
image.png
在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站,当请求发送到服务器时,实际是以 IP 地址形式访问。在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。
image.png

通信数据转发程序:代理、网关、隧道

HTTP 通信时,除客户端和服务器外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。它们配合服务器工作,将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。

代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
image.png
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。而且在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加 Via 头部字段以标记出经过的主机信息。

缓存代理

代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。

透明代理

代理转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,对报文内容进行加工的代理被称为非透明代理(匿名代理),匿名代理后,服务器将无法知道客户端的真实 IP,仅知道代理 IP。

网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
image.png
网关的工作机制和代理十分相似。利用网关可以将 HTTP 请求转化为其他协议通信。利用网关加密报文可以提高通信的安全性。

隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道本身是透明的,并且隧道本身不会解析 HTTP 请求,请求会保持原样中转给之后的服务器。隧道会在通信双方断开连接时自动结束,客户端甚至不用在意隧道的存在。
image.png

SSL 加密技术保障敏感数据在请求中安全传输。SSL 安全保密协议,在浏览器和 Web 服务器之间构造安全通道来进行数据传输,SSL 协议运行在 TCP/IP 层之上,应用层之下,为应用程序提供加密数据通道。HTTPS 协议实际上就是 HTTP over SSL,它使用默认 443 端口,而不是像 HTTP 使用 80 端口来和 TCP/IP 通信。HTTPS 协议使用 SSL 在发送方把原始数据进行加密,然后在接收方进行解密,加密和解密需要发送方和接收方通过交换共知的秘钥来实现,从而确保所传输的数据不会轻易被黑客截获和解密,但需要注意的是,加密和解密过程会耗费额外系统开销,降低机器的性能,HTTPS 协议传输数据的工作效率可能只有 HTTP 协议传输工作效率的十分之一。

保存资源的缓存

缓存是只代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可以减少与源服务器的不必要的交互,加快本地的响应速度,节省通信流量和通信时间。
image.png

缓存的有效期限

缓存中的数据具有一定的滞后性。当遇上服务器上的资源更新时,如果还是使用不变的缓存,那么就会返回更新前的“旧”资源。所以即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源并缓存。
image.png

客户端的缓存

缓存不仅可以存于缓存服务器中,也可以存在客户端浏览器中。和缓存服务器相同,当判断缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。image.png

浏览器会根据请求响应报文头部的缓存标识字段判断是否过期。客户端缓存也分强制缓存和协商缓存,如果是强制缓存,则这个标识可以是 expires 或 cache-control 字段,但后者的优先级更高。