一些 CDN 与网站优化的零散知识

目前(2022年5月)工作是维护某公司的对象存储和整套资源分发体系,经常跟 CDN 与客户端打交道,最近和网友闲聊过程中,发现有些知识虽然没有太大适用空间也说不上难点,但还算有趣,简单记录一下。

  1. 域名拆分、文件合并

主流浏览器限制了单个域名下同时打开的连接数,这一限制往往是个位数,对于一个资源比较多的静态网页,在 HTTP 1.x 的年代,可能会有较多时间花费在请求排队上。常见的优化方式是在网页上使用多个不同的域名分别加载一部分资源,以此提升并发度;或者将多个小文件合并为一个大文件,如雪碧图。

虽然 HTTP/1.1 提供了 pipelining 机制,但主流的 HTTP Server 基本没有正确实现;而 HTTP/2 提供了单个连接上并发请求的能力,虽然浏览器仍然限制了并发请求数,但这一限制往往是百这个数量级,已经能够满足大部分场景的需求。随着 HTTP/2 的逐渐普及,这一优化已经不再适用。

  1. 渐进式图片编码

JPG 等图片格式支持渐进式编码,在相对较慢的网络链接下,浏览器展示图片时,会有一个先模糊后清晰的效果,用于提升用户体验。但随着家用宽带网络速度的提升,这个“模糊”的大部分时候短到无法感知,所以谷歌在 WebP 中已经放弃了渐进式编码的支持。

对于图片占位符的需求,可以选择如 BlurHash 的优化策略。

  1. 域名高可用

在上面的描述中,我们认为已经没有必要为了加载速度而拆分多个域名,部分较为激进的网站所有资源都运行在单个域名下。但实际开发过程中,仍然建议大部分网站的开发人员保留多个域名随时切换的能力,因为:

  • 使用多个 CDN 服务商同时提供服务时,为了隔离单个服务商的故障域,可以在端上(APP 或网页)实现自动的域名降级逻辑,如 https://pic1.com/1.jpg 访问不通,就自动切换到 https://pic2.com/2.jpg,并保证同一地区不同域名解析到不同 CDN 厂商。
  • 国内部分地区运营商会随机劫持 DNS 查询结果,或乱缓存 HTTP 响应,为了一定程度上绕过这类问题,端上也要有能力自动域名降级。
  • 即使所有图片、文字都经过人工审核,也仍然可能因为审核人员没能及时更新自己的辱华知识,导致用户成功发表不良内容,部分高危内容,仅需要提交一个 URL,就可以举报封禁整个域名。有关部门也会要求 ISP 和 CDN 服务商停止服务。在这种情况下,需要有能力随时切换域名,以保证网站的可用性。入口域名与资源域名切割,最好备案主体都做隔离,用户上传的图片等资源使用独立域名提供服务,并有能力随时切换。
  1. CDN 回源强制 HTTPS 或其他加密措施

对于 NGINX 来说,HTTPS 卸载的成本并不低廉,部分开发者会要求 CDN 使用 HTTP 协议回源。但由于国内 ISP 会随机抓包检测,体量较大的网站有一定概率被捕获到包含敏感图片的 HTTP 流量,进而导致源站公网 IP 被封,影响网站可用性。

为了规避这种情况,即使是不直接对用户提供服务的接口,也要考虑使用 HTTPS 协议与厂商交互。