属于我们的Performance & Scalability系列
阅读完整指南CDN 性能优化:更快的全球交付完整指南
每改善 100 毫秒的延迟,电子商务转化率就会提高 1.1%。 对于每月营业额为 100 万美元的商店来说,这 100 毫秒的改善意味着每年可增加 132,000 美元的额外收入。 CDN 优化不是一项技术上的锦上添花——它是一个直接的收入杠杆。
本指南涵盖 CDN 架构、缓存策略、边缘计算以及 Web 应用程序、电子商务商店和 ERP 系统的性能调整。
要点
- 仅适当的缓存标头就可以减少源服务器负载 60-80%
- 通过 CDN 转换进行图像优化,在零代码更改的情况下将页面重量减少 40-60%
- 边缘计算使 API 逻辑更接近用户,将缓存响应的延迟从 200 毫秒减少到 20 毫秒
- 多 CDN 策略为全球受众提供故障转移和地理优化
CDN 架构基础知识
CDN 的工作原理
CDN 是分布在全球的服务器网络,可缓存并提供最靠近用户的位置的内容。
User in Tokyo --> CDN Edge (Tokyo, 5ms) --> [Cache HIT] --> Response
User in London --> CDN Edge (London, 5ms) --> [Cache MISS] --> Origin (US-East, +120ms) --> Cache + Response
User in London --> CDN Edge (London, 5ms) --> [Cache HIT] --> Response (subsequent requests)
缓存什么
| 内容类型 | 缓存持续时间 | 缓存控制头 |
|---|---|---|
| 静态资源(JS、CSS) | 1 年(不变) | 代码0 |
| 图片 | 30 天 | 代码0 |
| 字体 | 1 年 | 代码0 |
| HTML 页面(静态) | 5 分钟 | 代码0 |
| API 响应(公开) | 1-5 分钟 | 代码0 |
| API 响应(私有) | 不缓存 | 代码0 |
缓存控制头
Next.js 缓存配置
// next.config.ts
const nextConfig = {
async headers() {
return [
{
source: '/_next/static/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
{
source: '/images/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=2592000',
},
],
},
];
},
};
Nginx 缓存标头
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}
location ~* \.html$ {
expires 5m;
add_header Cache-Control "public, must-revalidate";
}
# API responses - let the application control caching
location /api/ {
proxy_pass http://backend;
proxy_cache_bypass $http_authorization;
}
图像优化
在大多数网站上,图片占页面重量的 50-70%。基于 CDN 的图像优化消除了构建时图像处理的需要。
Cloudflare 图像转换
<!-- Original: 2.4 MB JPEG -->
<!-- Optimized: 180 KB WebP, properly sized -->
<img
src="/cdn-cgi/image/width=800,quality=80,format=auto/images/product-hero.jpg"
alt="Product"
width="800"
height="600"
loading="lazy"
/>
Next.js 带有 CDN 的图像组件
// next.config.ts
const nextConfig = {
images: {
loader: 'custom',
loaderFile: './lib/image-loader.ts',
},
};
// lib/image-loader.ts
export default function cloudflareLoader({
src,
width,
quality,
}: {
src: string;
width: number;
quality?: number;
}) {
const params = [`width=${width}`, `quality=${quality || 80}`, 'format=auto'];
return `/cdn-cgi/image/${params.join(',')}${src}`;
}
图像优化影响
| 公制 | CDN优化前 | CDN优化后 |
|---|---|---|
| 平均图像尺寸 | 850 KB | 120 KB |
| 页面重量(图像) | 4.2 MB | 680 KB |
| LCP(最大内容涂料) | 3.8秒 | 1.4秒 |
| 总页面加载时间 | 5.2秒 | 2.1秒 |
边缘计算
用于 API 缓存的 Cloudflare Workers
// worker.js - Cache API responses at the edge
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
// Only cache GET requests to public API endpoints
if (request.method !== 'GET' || !url.pathname.startsWith('/api/public/')) {
return fetch(request);
}
const cache = caches.default;
const cacheKey = new Request(url.toString(), request);
// Check cache
let response = await cache.match(cacheKey);
if (response) {
return response;
}
// Fetch from origin
response = await fetch(request);
// Clone and cache successful responses
if (response.ok) {
const cachedResponse = new Response(response.body, response);
cachedResponse.headers.set('Cache-Control', 'public, max-age=300');
cachedResponse.headers.set('X-Cache-Status', 'MISS');
event.waitUntil(cache.put(cacheKey, cachedResponse.clone()));
return cachedResponse;
}
return response;
}
电子商务的边缘用例
| 使用案例 | 延迟改善 | 实施 |
|---|---|---|
| 产品目录API | 200 毫秒至 5 毫秒 | 在边缘缓存 5 分钟 |
| 地理位置重定向 | 100 毫秒至 1 毫秒 | 具有 IP 查找功能的边缘工作人员 |
| A/B 测试 | 50 毫秒至 0 毫秒 | 边缘工作者分配变体 |
| 机器人检测 | 100 毫秒至 5 毫秒 | 出发前的边缘挑战 |
| 价格本地化 | 150 毫秒至 5 毫秒 | 具有货币兑换功能的边缘工作者 |
CDN 提供商比较
| 特色 | 云耀 | AWS CloudFront | AWS CloudFront快点 | 兔子 CDN |
|---|---|---|---|---|
| 全球 PoP | 310+ | 450+ | 80+ | 114+ |
| 免费套餐 | 慷慨 | 1 TB/月(12 个月) | 无 | 无 |
| 边缘计算 | 工人 | Lambda@Edge | 计算@边缘 | 边缘脚本 |
| 图像优化 | 内置 | 需要 Lambda | 内置 | 内置 |
| WebSocket 支持 | 是的 | 是的 | 是的 | 是的 |
| DDoS 防护 | 包含 | AWS 盾(额外) | 包含 | 基本 |
| 起拍价 | 免费 | 按使用付费 | 50 美元/月 | 1 美元/月 |
建议:适用于大多数企业的 Cloudflare。免费套餐非常慷慨,边缘网络最大,Workers 无需额外基础设施即可提供强大的边缘计算。
多 CDN 策略
为什么选择多 CDN
没有哪个 CDN 在每个地区都具有最佳性能。多 CDN 策略将用户路由到其所在位置性能最佳的 CDN:
| 方法 | 复杂性 | 成本 | 效益 |
|---|---|---|---|
| 主要+故障转移 | 低 | 1.1 倍 | 可靠性 |
| 地理路线 | 中等 | 1.3 倍 | 延迟优化 |
| 基于性能的路由 | 高 | 1.5 倍 | 最佳延迟 |
实施
使用 DNS 级路由将用户引导至最佳 CDN:
User request -> DNS (Cloudflare/Route53)
|
+--> US/EU traffic -> Cloudflare (best PoP coverage)
|
+--> APAC traffic -> AWS CloudFront (strong APAC presence)
|
+--> China traffic -> Alibaba CDN (required for China performance)
对于大多数企业来说,在 DNS 级别配置故障转移 CDN 的单个 CDN (Cloudflare) 可以提供足够的冗余,而无需复杂的完整多 CDN 路由。
常见的 CDN 陷阱
陷阱 1:缓存经过身份验证的内容
切勿缓存包含用户特定数据的响应。用户 A 向用户 B 提供的缓存响应存在安全漏洞。对所有经过身份验证的 API 响应使用 Cache-Control: private, no-store。
陷阱 2:忽略部署的缓存清除
当您部署新的 JavaScript 或 CSS 时,用户可能会收到缓存的旧版本。解决方案:
- 内容哈希:在文件名中包含哈希 (
app.a1b2c3d4.js)。 Next.js 自动执行此操作。 - 部署时清除缓存:作为部署管道的一部分清除 CDN 缓存。
- 版本化 URL:
/v2/styles.css而不是/styles.css。
陷阱 3:动态内容的 CDN 配置错误
如果您的 CDN 缓存了不应缓存的动态内容(API 响应、具有用户状态的 HTML 页面),您将提供陈旧或不正确的数据。定期审核您的 CDN 缓存规则并使用 Vary 标头来防止缓存冲突。
绩效衡量
核心 Web Vitals 目标
| 公制 | 好 | 需要改进 | 可怜 |
|---|---|---|---|
| LCP(最大内容涂料) | <2.5秒 | 2.5-4.0秒 | >4.0 秒 |
| INP(与下一个绘画的交互) | <200 毫秒 | 200-500 毫秒 | >500 毫秒 |
| CLS(累积布局偏移) | <0.1 | 0.1-0.25 | >0.25 |
监控缓存性能
# Check CDN cache hit ratio
curl -sI https://example.com/page | grep -i "cf-cache-status\|x-cache\|age"
# Expected output for a cached response:
# cf-cache-status: HIT
# age: 3600
跟踪一段时间内的缓存命中率。目标:静态资产85%以上,动态内容50%以上。
常见问题
如果我们的用户位于一个国家/地区,我们是否需要 CDN?
是的,但好处会发生变化。您获得的不是地理延迟减少,而是:DDoS 保护、SSL 终止卸载、图像优化和源服务器负载减少。即使对于单一国家/地区的受众,CDN 也可以降低服务器成本并提高可靠性。 Cloudflare 免费套餐使这一改进成为零成本。
我们如何处理动态内容的缓存失效?
三种策略:(1) 针对频繁更改的内容的短 TTL(1-5 分钟),(2) 缓存标签,并按标签清除内容更新,(3) stale-while-revalidate 标头,用于在后台获取新内容的同时提供缓存内容。单独使用 s-maxage 进行 CDN 缓存,使用 max-age 进行浏览器缓存。
我们应该为 ERP 系统使用 CDN 吗?
CDN 有利于 ERP 静态资产(JavaScript、CSS、图像)和面向公众的门户。不要缓存经过身份验证的 API 响应或与会话相关的内容。 ECOSIRE 将 CDN 缓存配置为我们的 Odoo 实施服务 的一部分,以确保最佳缓存而不存在安全风险。
CDN如何与服务端渲染交互?
对于 Next.js SSR 页面,将 CDN 配置为基于具有短 TTL(1-5 分钟)的完整 URL(包括查询参数)进行缓存。使用 stale-while-revalidate 提供稍微陈旧的内容,同时 Next.js 在后台重新生成。 ISR(增量静态再生)可以自然地与 CDN 缓存配合使用。
接下来会发生什么
CDN 优化自然地与负载测试配对以验证负载下的性能,并与监控配对以跟踪缓存命中率和延迟。有关完整的基础设施优化路线图,请参阅我们的小型企业 DevOps 指南。
联系 ECOSIRE 以获取 CDN 设置和性能优化咨询。
由 ECOSIRE 发布——帮助企业在全球范围内更快地交付内容。
作者
ECOSIRE Research and Development Team
在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。
相关文章
更多来自Performance & Scalability
AI 代理性能优化:速度、准确性和成本效率
利用经过验证的快速工程、缓存、模型选择和监控技术,在响应时间、准确性和成本方面优化 AI 代理性能。
测试和监控人工智能代理:自治系统的可靠性工程
测试和监控 AI 代理的完整指南,涵盖单元测试、集成测试、行为测试、可观察性和生产监控策略。
Web 应用程序的负载测试策略:在用户之前找到突破点
使用 k6、Artillery 和 Locust 对 Web 应用程序进行负载测试。涵盖测试设计、流量建模、性能基线和结果解释策略。
电子商务移动 SEO:2026 年完整优化指南
电子商务网站的移动 SEO 指南。涵盖移动优先索引、核心网络生命、结构化数据、页面速度优化和移动搜索排名因素。
生产监控和警报:完整的设置指南
使用 Prometheus、Grafana 和 Sentry 设置生产监控和警报。涵盖指标、日志、跟踪、警报策略和事件响应工作流程。
API 性能:速率限制、分页和异步处理
使用速率限制算法、基于游标的分页、异步作业队列和响应压缩最佳实践构建高性能 API。