CDN加速配置终极指南:让网站访问速度提升3倍的实战经验

CDN到底解决了什么问题

去年给一个广州的电商客户做优化,服务器在阿里云北京机房,广东用户打开首页要2.8秒。纯靠服务器侧优化已经到天花板了,加上CDN之后,广东用户首屏时间降到0.9秒,转化率直接涨了22%。

CDN的核心是把静态资源缓存到离用户最近的节点。用户请求资源时,DNS智能解析到最近的边缘节点,直接从节点返回缓存,不用每次都回源。这一步省掉的不是几十毫秒,是跨地区网络传输的几百毫秒。

怎么选CDN服务商

市面上的CDN服务商一大堆,先给个对比:

服务商 国内节点数 海外覆盖 计费方式 适合场景
阿里云CDN 2800+ 一般 流量/带宽 国内业务为主
腾讯云CDN 2500+ 较好 流量/带宽 游戏、视频
Cloudflare 国内有限 300+城市 流量包 海外业务
又拍云 600+ 一般 流量包 中小站点

国内业务推荐阿里云或者腾讯云,节点多价格透明。海外业务Cloudflare是首选,免费版就够中小站点用,Pro版20美元一个月带WAF防护。

域名拆分与CNAME配置

CDN配置的第一步是把静态资源拆到独立子域名,比如 cdn.example.com。混在主域名下没法精细控制缓存策略,还会被cookie污染,每次请求都带上几KB的cookie纯属浪费。

DNS侧添加CNAME记录,把 cdn.example.com 指向CDN服务商提供的加速域名:

cdn.example.com  CNAME  example.com.cdn.dnsv1.com

CDN控制台回源地址填源站IP或者域名,回源协议跟着源站走,源站HTTPS就选HTTPS回源。

缓存策略是性能命脉

CDN配完不等于万事大吉,缓存规则配错的话等于花钱买了个反向代理。核心原则:HTML文件不缓存或者短缓存,静态资源长缓存。

Nginx源站侧的响应头这样配:

# HTML文件不缓存
location ~ \.html$ {
    add_header Cache-Control "no-cache, must-revalidate";
}

# 静态资源长缓存1年
location ~* \.(js|css|png|jpg|jpeg|gif|webp|svg|woff2)$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
}

immutable 这个参数很多人不知道,它告诉浏览器这个资源永远不会变,连304验证请求都省了。前提是文件名带hash,发布新版本时hash变了URL也变了,老缓存自然失效。

CDN控制台的缓存规则

CDN服务商控制台还要配一套缓存规则,覆盖源站的响应头。规则优先级从上到下,第一条匹配上就用第一条:

  1. .html$ 缓存0秒,每次回源
  2. .php$ 缓存0秒
  3. .*\.(js|css|png|jpg|webp)$ 缓存30天
  4. /api/* 不缓存

API接口千万别缓存,我见过一个客户把登录接口缓存了30天,所有用户登录后看到的都是同一个账号信息,差点酿成安全事故。

预热与刷新

上线新版本时,静态资源URL变了,CDN节点上还是老URL的缓存。需要主动预热,让CDN提前把新资源拉到节点上。

阿里云CDN的预热API调用示例:

curl -X POST https://cdn.aliyuncs.com \
  --data-urlencode "Action=PushObjectCache" \
  --data-urlencode "ObjectPath=https://cdn.example.com/js/app.v2.0.js" \
  --data-urlencode "AccessKeyId=YOUR_KEY"

刷新是反向操作,把节点上的缓存清掉,强制下次请求回源。改完CSS紧急修复bug时用。刷新分URL刷新和目录刷新,目录刷新影响范围大,慎用。

HTTPS与CDN的配合

CDN节点也要配HTTPS证书,否则用户访问CDN域名时浏览器报红。主流服务商都支持免费上传证书或者一键申请Let’s Encrypt。

回源协议选HTTPS回源,但要注意CDN到源站的SSL握手会消耗时间,开启会话复用能减少70%的握手开销。回源超时设长一点,默认3秒在某些场景不够。

跨域配置

静态资源拆到子域名后,字体文件和fetch请求会触发CORS。Nginx源站加响应头:

location ~* \.(woff2|ttf|otf|eot)$ {
    add_header Access-Control-Allow-Origin "https://example.com";
    add_header Access-Control-Allow-Methods "GET";
}

别用 Access-Control-Allow-Origin: *,存在安全隐患。明确指定允许的域名。

监控与调优

CDN控制台的监控数据要看,重点几个指标:

  • 缓存命中率:低于80%就要查缓存规则
  • 回源带宽:突然飙升说明缓存失效
  • 状态码分布:4xx占比高检查URL

某次客户CDN命中率从92%掉到45%,排查发现是改版后图片文件名没加hash,每次更新都触发回源。改成hash命名后命中率回到95%,月账单降了三分之一。

性能数据对比

指标 无CDN 配置CDN后
广东首屏 2.8s 0.9s
北京首屏 1.2s 0.6s
月流量费 800元 350元
缓存命中率 0% 94%

CDN流量费比源站带宽便宜,命中率上去之后总成本反而降了。

避坑清单

  • 不要把动态接口走CDN缓存,会出大事
  • 缓存规则改完别忘点”刷新预热”,等自然过期会等死人
  • CDN证书过期了源站证书没过期,监控只看源站会漏
  • 海外节点流量计费贵,没海外业务就关掉海外节点
  • 测速别只测自己办公室,用17ce或者博纳云多点测速
  • 回源鉴权必须开启,防止源站IP泄露被直接访问