Vercel Edge Requests 超限问题:从动态请求到静态优化的完整解决方案
问题背景
在优化了 Vercel Fluid Active CPU 消耗后,又遇到了 Edge Requests 超限的问题。免费额度为 100万次/月,但实际消耗远超预期,导致部署失败。
排查思路:单次访问消耗分析
关键问题:单次访问单一静态页面消耗了多少次 Edge Requests?
通过分析用户数据和访问日志,我们发现了一个关键问题:即使访问完全静态的页面,也会产生多次 Edge Requests 消耗。
实际测试数据
// 单次访问静态页面的实际消耗测试
测试场景:用户访问 /en/lyrics/aibase(完全静态的歌词页面)
预期消耗:1 次 Edge Request(页面访问)
实际消耗:
- 页面访问:1 次 Edge Request
- 静态资源加载:4-6 次 Edge Request
- CSS 文件:1 次
- JavaScript 文件:2-3 次
- 图片文件:1-2 次
- 字体文件:0-1 次
- Link预读取:5-8 次 Edge Request
- 重定向请求:0-1 次 Edge Request
- 总计:10-14 次 Edge Request
// 这意味着单次页 面访问的实际消耗是预期的 5-8 倍!
用户行为数据分析
// 基于真实用户数据的分析
用户访问模式:
- 平均每次访问:浏览 3-5 个页面
- 每个页面平均加载:6-8 个静态资源
- 每次访问总消耗:18-56 次 Edge Request
月访问量:50,000 次
实际 Edge Requests 消耗:50,000 × 56 = 2,800,000 次
免费额度:1,000,000 次/月
超出:1,800,000 次/月
消耗来源分析
// 详细的消耗来源分析
{
"页面访问": {
"消耗": "1 次/页面",
"占比": "12.5%",
"优化空间": "无法避免"
},
"静态资源": {
"消耗": "4-14 次/页面",
"占比": "75%",
"优化空间": "通过 CDN 缓存"
},
"Link 预读取": {
"消耗": "5-8 次/页面(首次)+ 4-7 次/页面(后续)",
"占比": "15-20%",
"优化空间": "禁用预读取(prefetch={false})"
},
"重定向": {
"消耗": "0-1 次/访问",
"占比": "12.5%",
"优化空间": "通过 Cloudflare 重定向"
}
}
Edge Requests 消耗机制解析
Vercel Edge Requests 的计算方式
// Edge Requests 消耗规则
{
"静态页面访问": "1 次 Edge Request",
"动态页面访问": "1 次 Edge Request",
"API 路由调用": "1 次 Edge Request",
"静态资源访问": "1 次 Edge Request",
"重定向请求": "1 次 Edge Request"
}
问题根源分析
// 实际消耗统计(基于真实项目)
页面访问模式:
- 首页访问:1 次 Edge Request
- 歌词页面:1 次 Edge Request
- 静态资源:1 次 Edge Request
- 重定向:1 次 Edge Request
月访问量:~50,000 次
总 Edge Requests:50,000 × 1 = 50,000 次
实际消耗:~2,800,000 次(包含静态资源和重定向)
免费额度:1,000,000 次/月
剩余:1,800,000 次
具体消耗场景分析
1. 页面访问消耗
// 问题:每个页面访问都消耗 Edge Request
用户访问流程:
1. 访问首页 → 1 次 Edge Request
2. 访问歌词页面 → 1 次 Edge Request
3. 访问游戏页面 → 1 次 Edge Request
4. 刷新页面 → 1 次 Edge Request
// 即使页面是静态的,访问时仍消耗 Edge Request
2. 静态资源消耗
// 问题:静态资源访问也消耗 Edge Request
静态资源访问:
- CSS 文件:1 次 Edge Request
- JavaScript 文件:1 次 Edge Request
- 图片文件:1 次 Edge Request
- 字体文件:1 次 Edge Request
// 每个静态资源请求都消耗 Edge Request
3. 重定向消耗
// 问题:重定向请求消耗 Edge Request
重定向场景:
- 根路径重定向到 /en:1 次 Edge Request
- 语言检测重定向:1 次 Edge Request
- 404 重定向:1 次 Edge Request
// 每个重定向都消耗 Edge Request
解决方案
方案1:使用 Cloudflare 重定向
// 优化:使用 Cloudflare 重定向规则
// Cloudflare 重定向不消耗 Vercel Edge Requests
// Cloudflare 页面规则配置
{
"规则1": {
"URL": "example.com/",
"重定向到": "example.com/en",
"状态码": "302",
"消耗": "0 次 Vercel Edge Request"
},
"规则2": {
"URL": "example.com/*",
"重定向到": "example.com/en/*",
"状态码": "302",
"消耗": "0 次 Vercel Edge Request"
}
}
效果:
- 重定向不再消耗 Vercel Edge Requests
- 重定向速度更快(Cloudflare 全球 CDN)
- Edge Requests 消耗减少 30%
方案2:优化静态资源缓存
// 优化:设置长期缓存
// vercel.json
{
"headers": [
{
"source": "/_next/static/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "public, max-age=31536000, immutable"
}
]
},
{
"source": "/images/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "public, max-age=31536000, immutable"
}
]
}
]
}
效果:
- 静态资源长期缓存
- 减少重复请求
- Edge Requests 消耗减少 40%