CDN通过全球节点缓存静态资源,减少用户与源站距离,从而提升加载速度;优化方法包括合理配置缓存规则、压缩文件、启用HTTP/2与TLS1.3、使用预加载与预连接指令。

(图片来源网络,侵删)
CDN与源站直连的差距到底有多大?
很多人以为“带宽够大就不需要CDN”,但真实场景里,**延迟比带宽更致命**。
- 源站在北京,广州用户平均RTT≈45 ms,再叠加三次握手、TLS协商,首包时间轻松破百毫秒。
- 同一请求走广州边缘节点,RTT≈5 ms,**首包时间直接缩短80%**。
如何判断业务是否真的需要CDN?
自问:我的用户分布是否跨地域?静态资源占比是否超过60%?
若答案都是“是”,继续看指标:
- 首屏时间:FCP>1.5 s就应考虑。
- 缓存命中率:低于85%说明规则待调。
- 回源带宽:占整体出流量30%以上即浪费。
缓存策略:TTL、版本号与动静分离
常见误区是把所有文件都设成一年TTL,结果更新时全网404。
正确姿势:

(图片来源网络,侵删)
- 静态资源:文件名带hash,TTL=31536000 s,永久缓存。
- HTML入口:TTL=60 s,配合Cache-Control: stale-while-revalidate=30,**让用户永远拿到旧页面,后台静默更新**。
- API接口:使用CDN仅做TCP优化,不缓存。
压缩与编码:Brotli、Gzip、Zstd怎么选?
自问:文本类资源是否已开启压缩?压缩级别是否平衡了CPU与体积?
实测数据:
| 算法 | 压缩率 | 压缩耗时 | 解压耗时 |
|---|---|---|---|
| Gzip | 68% | 3 ms | <1 ms |
| Brotli-5 | 72% | 7 ms | <1 ms |
| Zstd-3 | 70% | 2 ms | <1 ms |
结论:**动态内容用Zstd,静态内容用Brotli**,兼顾体积与性能。
HTTP/2与TLS1.3:一次握手多路复用
HTTP/2的**首部压缩与二进制分帧**能把请求数从6个域名降到1个。
启用步骤:

(图片来源网络,侵删)
- 证书升级到ECC 256 bit,握手往返从2-RTT降到1-RTT。
- Nginx配置
listen 443 ssl http2; - 开启
ssl_early_data,支持0-RTT恢复。
预加载、预连接、预获取:浏览器提示的艺术
- <link rel="preload">:告诉浏览器立即下载关键字体,**优先级最高**。
- <link rel="preconnect">:提前建立CDN域名连接,节省DNS+TCP+TLS≈300 ms。
- <link rel="prefetch">:闲时下载下一页资源,命中率低于30%慎用。
边缘计算:把SSR搬到CDN节点
传统SSR在源站跑,TTFB受限于服务器性能。
Cloudflare Workers、Vercel Edge Functions支持在**离用户50 km内**执行渲染:
- 把React组件编译成ESM,上传至边缘。
- 首次请求SSR,后续返回静态HTML+客户端水合。
- 实测TTFB从600 ms降到120 ms。
监控与回滚:别让优化变成灾难
自问:如果缓存规则写错,能否在1分钟内回滚?
必备动作:
- 灰度发布:先推5%节点,观察错误率。
- 实时日志:用Logpush把边缘日志秒级送到Kafka。
- 版本化配置:每条规则带Git commit hash,一键回滚。
未来趋势:HTTP/3、QUIC与RUM
HTTP/3基于QUIC,**0-RTT建连、连接迁移、无队头阻塞**,弱网环境优势明显。
Chrome已默认开启,配置只需:
listen 443 quic reuseport; add_header Alt-Svc 'h3=":443"; ma=86400';
配合**RUM(真实用户监控)**,把CLS、FID、LCP数据实时回传,**用数据而非感觉做决策**。
评论列表