-
启用长连接。TCP 和 SSL 建立新连接的成本是非常高的,有可能会占到客户端总延迟的一半以上。长连接虽然不能优化连接握手,但可以把成本“均摊”到多次请求里,这样只有第一次请求会有延迟,之后的请求就不会有连接延迟,总体的延迟也就降低了。
-
在现代操作系统上启用 TCP 的新特性“TCP Fast Open”(Win10、iOS9、Linux 4.1),它的效果类似 TLS 的“False Start”,可以在初次握手的时候就传输数据,也就是 0-RTT,所以我们应该尽可能在操作系统和 Nginx 里开启这个特性,减少外网和内网里的握手延迟。
-
数据压缩编码不仅可以使用标准的gzip,还可以使用新压缩算法br,有更好的压缩效果。除此之外,对于HTTP协议传输的各种格式数据,我们可以有针对性地采用特殊的压缩方式。
- HTML/CSS/JavaScript 属于纯文本,就可以采用特殊的压缩,去掉源码里多余的空格、换行、注释等元素。
- 图片在 HTTP 传输里占有非常高的比例,虽然它本身已经被压缩过了,不能被 gzip、br 处理,但仍然有优化的空间。比如说,去除图片里的拍摄时间、地点、机型等元数据,适当降低分辨率,缩小尺寸。图片的格式也很关键,尽量选择高压缩率的格式,有损格式应该用 JPEG,无损格式应该用 Webp 格式。
- 刚才说的几种数据压缩针对的都是 HTTP 报文里的 body,在 HTTP/1 里没有办法可以压缩 header,但我们也可以采取一些手段来减少 header 的大小,不必要的字段就尽量不发(例如 Server、X-Powered-By)
- 对于小文本或者小图片,可以使用资源合并的方式,把许多小资源合并成一个大资源,用一个请求全下载到客户端,然后客户端再切分后使用,好处是节省了请求次数,缺点是可能会缓存有影响,可能降低缓存的可用性
-
收缩域名。如果网站拥有多个域名,那么域名解析获取 IP 地址就是一个不小的成本,限制在两三个左右,减少解析完整域名所需的时间,让客户端尽快从系统缓存里获取解析结果。
-
尽量不使用重定向。重定向引发的客户端延迟也很高,它不仅增加了一次请求往返,还有可能导致新域名的 DNS 解析。
-
利用好缓存,为每个资源都添加 ETag 和 Last-modified 字段,再用 Cache-Control、Expires 设置好缓存控制属性。