部署上线
CDN 加速配置
使用 CDN 提升全球访问速度
CDN(内容分发网络)将内容缓存到全球节点,用户访问时从最近的节点获取,大幅提升速度。
为什么需要 CDN
- 加速访问:用户从最近的节点获取内容
- 降低延迟:减少网络传输距离
- 减轻服务器压力:静态资源由 CDN 承担
- 提高可用性:节点故障时自动切换
托管平台自带 CDN
大多数托管平台自动配置 CDN,无需额外设置。
Vercel
- 自动使用全球 CDN
- 静态资源自动缓存
- 支持边缘函数
Cloudflare Pages
- 使用 Cloudflare 全球网络
- 自动缓存优化
- 免费无限带宽
Railway / Fly.io
- 支持多区域部署
- 自动路由到最近节点
独立 CDN 服务
如果自建服务器,可以使用独立 CDN。
Cloudflare(推荐)
优点:
- 免费
- 全球节点最多
- 自动 HTTPS
- DDoS 防护
配置步骤:
- 在 Cloudflare 添加网站
- 修改域名 Nameservers
- 开启 Proxy(橙色云朵)
- 配置缓存规则
其他 CDN
- AWS CloudFront:与 AWS 服务集成好
- 阿里云 CDN:国内速度快
- 腾讯云 CDN:价格便宜
配置缓存策略
静态资源
应该长期缓存:
# Nginx 配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}HTML 页面
不应该缓存或短期缓存:
location ~* \.html$ {
expires 5m;
add_header Cache-Control "public, must-revalidate";
}API 响应
根据业务决定:
// Next.js API Route
export async function GET() {
return new Response(JSON.stringify(data), {
headers: {
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=30'
}
})
}Cloudflare 缓存配置
页面规则
- 进入 Cloudflare → Rules → Page Rules
- 创建规则:
- URL:
example.com/static/* - 设置:Cache Level = Cache Everything
- Edge Cache TTL = 1 month
- URL:
缓存级别
- Standard:只缓存静态资源
- Ignore Query String:忽略查询参数
- Cache Everything:缓存所有内容(包括 HTML)
清除缓存
# 使用 Cloudflare API
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {api_token}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'图片优化
使用 WebP 格式
// Next.js Image 组件自动优化
import Image from 'next/image'
<Image
src="/photo.jpg"
width={800}
height={600}
alt="Photo"
/>Cloudflare Images
<!-- 自动调整大小和格式 -->
<img src="https://example.com/cdn-cgi/image/width=800,format=auto/photo.jpg">图片 CDN
- Cloudinary:功能最全,免费 25GB/月
- imgix:性能好,价格贵
- Cloudflare Images:$5/月 10 万张
字体优化
自托管字体
@font-face {
font-family: 'Inter';
src: url('/fonts/inter.woff2') format('woff2');
font-display: swap;
}使用 CDN
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter&display=swap" rel="stylesheet">预加载和预连接
预加载关键资源
<link rel="preload" href="/critical.css" as="style">
<link rel="preload" href="/hero.jpg" as="image">预连接到外部域名
<link rel="preconnect" href="https://api.example.com">
<link rel="dns-prefetch" href="https://analytics.example.com">监控 CDN 性能
Cloudflare Analytics
在 Cloudflare 后台查看:
- 请求数
- 带宽使用
- 缓存命中率
- 响应时间
缓存命中率
理想情况:
- 静态资源:> 95%
- 动态内容:根据业务
提升缓存命中率:
- 增加缓存时间
- 使用一致的 URL
- 避免不必要的查询参数
国内 CDN
如果目标用户在国内,使用国内 CDN:
阿里云 CDN
- 购买 CDN 服务
- 添加加速域名
- 配置源站
- 修改 DNS CNAME
注意:域名需要备案。
价格
- 按流量计费:¥0.24/GB(国内)
- 按带宽计费:¥0.53/Mbps/天
常见问题
缓存不生效
- 检查 Cache-Control 头
- 确认 CDN 配置正确
- 清除 CDN 缓存
更新后用户看到旧内容
- 使用版本化 URL(如
style.v2.css) - 清除 CDN 缓存
- 减少缓存时间
如何强制刷新
<!-- 添加版本号或哈希 -->
<link rel="stylesheet" href="/style.css?v=1.2.3">
<script src="/app.js?hash=abc123"></script>最佳实践
1. 静态资源版本化
// Next.js 自动添加哈希
// /static/css/main.abc123.css2. 使用 CDN 域名
<!-- 使用独立域名 -->
<img src="https://cdn.example.com/photo.jpg">3. 启用压缩
# Nginx
gzip on;
gzip_types text/css application/javascript image/svg+xml;4. 设置合理的缓存时间
- 不变的资源:1 年
- 经常变的资源:1 小时
- 实时数据:不缓存
免费 CDN 对比
| CDN | 免费额度 | 节点数 | 特点 |
|---|---|---|---|
| Cloudflare | 无限 | 300+ | 功能最全 |
| jsDelivr | 无限 | 100+ | 专注开源库 |
| Vercel | 100GB/月 | 全球 | 集成部署 |