Eavan's Blog LogoEavan's Blog
TAGSFRIENDSBOOKSSEARCH
TAGS
FRIENDS
BOOKS
SEARCH
Eavan's Blog LogoEAVAN
·

心如止水,字如清风

流水不争先 · 2025

NEXTJS项目添加cdn加速

12/22/2025
6 分钟

作者

标签

参考

精选

背景

年中的时候腾讯云和阿里云在疯狂推销自家的边缘加速,我当初在国际站部署过一次全站加速,最后感觉国内访问的速度还没直连的快因此放弃了(因为没有备案),众所周知在国内运营网站时,未备案域名无法使用国内 CDN 进行全站加速。但如果你有一个已备案的子域名,可以将静态资源"代理"到该子域名,借助 EdgeOne 实现加速。

核心思路:

  • 主站点 eavan.dev(未备案)→ 正常部署到国外vps,不走国内 CDN
  • 子域名 static.eavan.top(已备案)→ 接入 EdgeOne,加速静态资源
  • S3 存储桶 → 通过 EdgeOne 回源加速图片, 我单独配置了一个域名,其实也可以用源站组的方式共用一个域名

架构规划图

加载图表中...

一、前期检查清单

1.1 域名与备案状态确认

  • 确认子域名已完成 ICP 备案
  • 确认 DNS 解析权限(推荐使用 DNSPod 或 Cloudflare)

1.2 资源盘点

资源类型

路径/位置

预期加速域名

CSS/JS

/_next/static/*

static.eavan.top

图片

S3 Bucket

img.eavan.top

字体

/_next/static/media/*

static.eavan.top

1.3 Next.js 配置检查

确认 next.config.js 支持自定义 assetPrefix


然后还要配置一下next/image组件的安全规则 网站图标Components: Image Component | Next.js

二、EdgeOne 配置步骤

我选择的直接就是选择网站图标国内站点, 因为国际站实名需要根据地区去实名认证才能用国内节点, 反正就很麻烦, 我注册的地区是新加坡, 然后认证就需要新加坡的护照去实名认证

2.1 添加站点

DNSEdgeOne控制台用户DNSEdgeOne控制台用户添加站点 [example.com](http://example.com)返回 NS 记录或 CNAME配置 DNS 解析验证通过站点生效

操作路径: EdgeOne 控制台 → 站点管理 → 添加站点

接入方式选择:

  • NS 接入:将整个域名 DNS 托管给 EdgeOne(推荐,功能最全)
  • CNAME 接入:仅针对特定子域名,保留原 DNS 服务商

2.2 配置加速子域名

静态资源加速(CSS/JS)

配置项

值

加速域名

static.eavan.top

源站类型

域名回源

源站地址

eavan.dev(主站点)

回源 Host

eavan.dev

回源协议

HTTPS

S3 图片加速

配置项

值

加速域名

img.eavan.top

源站类型

对象存储 / 域名回源

源站地址

your-bucket.s3.ap-northeast-1.amazonaws.com

回源 Host

S3 Bucket 域名

回源协议

HTTPS

2.3 缓存规则配置

操作路径: EdgeOne 控制台 → 站点加速 → 缓存配置

EdgeOne 提供三种缓存配置方式:

  • 全局设置 (Global Settings):站点级别配置,最简单
  • 规则引擎 (Rule Engine):基于条件的细粒度配置(推荐)
  • 边缘函数 (Edge Functions):代码级别控制,最灵活
加载图表中...

2.3.1 节点缓存 TTL (Node Cache TTL)

节点缓存是指资源在 EdgeOne 边缘节点上的缓存时间。

配置项

说明

推荐值

缓存规则

遵循源站 / 不缓存 / 自定义

自定义

默认缓存时间

源站未返回 Cache-Control 时生效

7 天

强制缓存

忽略源站 Cache-Control: no-cache/no-store

根据场景开启

推荐缓存规则(规则引擎配置):

匹配条件

节点缓存 TTL

说明

/_next/static/*

31536000s (1年)

Next.js 静态资源带 hash,可长期缓存

*.js / *.css

31536000s

同上

*.jpg / *.png / *.webp

2592000s (30天)

图片资源

*.woff2 / *.ttf

31536000s

字体文件

/api/*

0 (不缓存)

动态内容始终回源

2.3.2 浏览器缓存 TTL (Browser Cache TTL)

控制客户端浏览器的缓存行为,通过修改响应头 Cache-Control: max-age 实现。

配置项

说明

推荐值

遵循源站

使用源站返回的 Cache-Control

默认

自定义

覆盖源站设置,统一浏览器缓存时间

静态资源: 1 年

不缓存

返回 Cache-Control: no-cache

HTML/API 用

2.3.3 自定义缓存键 (Custom Cache Key)

缓存键决定了哪些请求会命中同一份缓存。默认为 URL 全路径,可根据业务需求调整。

配置项

说明

推荐设置

忽略查询字符串

忽略 URL 中的 ?xxx=yyy 参数

静态资源开启

保留指定参数

只保留特定查询参数作为缓存键

按需配置

包含请求头

将指定 Header 纳入缓存键

多语言站点可加 Accept-Language

包含 Cookie

将指定 Cookie 纳入缓存键

谨慎使用,降低命中率

对于 Next.js 静态资源 /_next/static/*,建议开启「忽略查询字符串」,因为文件名本身已包含 hash。

2.3.4 离线缓存 (Offline Caching)

当源站不可用时,继续使用边缘节点上的过期缓存,保证业务可用性。

配置项

说明

推荐

开启离线缓存

源站故障时使用过期缓存响应

✅ 建议开启

2.3.5 缓存刷新 (Cache Purge)

部署新版本后需要清除旧缓存。

刷新方式

说明

使用场景

URL 刷新

精确刷新指定 URL

单个文件更新

目录刷新

刷新指定路径下所有文件

批量更新

全站刷新

清除整个站点缓存

大版本发布

Cache-Tag 刷新

按标签刷新(需配合响应头)

精细化运营

API 方式刷新缓存示例

2.3.6 智能压缩 (Smart Compression)

自动压缩响应内容,减少传输体积。

配置项

说明

推荐

Gzip 压缩

通用压缩,兼容性好

✅ 开启

Brotli 压缩

压缩率更高,现代浏览器支持

✅ 开启

三、Next.js 代码改造

3.1 自定义图片 Loader

伪代码如下, 根据自己项目求改,别忘记环境变量和前面的nextjs.config的配置内容

四、排查与验证

4.1 验证清单

  • 访问 https://cdn.example.com/_next/static/chunks/main.js 返回正常
  • 检查响应头包含 Cache: HIT(表示命中缓存)
  • 图片 https://img.example.com/path/to/image.jpg 加载正常
  • 主站 HTML 中静态资源 URL 已替换为 CDN 域名
eavan-dev-004438@2x.jpg


4.2 常见问题排查

问题 1:CORS 跨域错误

解决方案: 在 EdgeOne 或源站配置 CORS 响应头:

Access-Contro

l-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, OPTIONS

eavan-dev-004440@2x.jpg

问题 2:资源 404

可能原因

排查方法

解决方案

回源 Host 错误

curl -H "Host: xxx" 源站

修正回源 Host

路径不匹配

检查 assetPrefix 配置

确保路径一致

源站未部署

直接访问源站资源

先部署再配置 CDN

如未标记非原创,转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,未经站长允许不得对文章文字内容进行修改演绎,不得用于商业目的。
本文采用CC BY-NC-SA 4.0 - 非商业性使用 - 相同方式共享 4.0 国际进行许可。

架构规划图