前言
EdgeOne 最近讨论度挺高,我自己的个人版从去年年底用到现在,七个多月。这篇不是广告,就是把这几个月琢磨出来的配置整理一遍,省得每次有人问起,我都得重新截图讲一遍。
EdgeOne 是什么
腾讯云 EdgeOne 是一套边缘安全加速平台。请求先到离用户最近的边缘节点,静态内容由节点直接返回,动态请求在节点上做一层安全和转发处理再回源。对个人站来说,最直接的收益是首字节变短、源站压力变小,顺带还能挡掉一部分扫描和攻击。
它把原本得分开买的好几样东西合在了一起:
- DDoS 防护、CC 防护、Web 防护、Bot 管理
- CDN 静态加速,以及动静态混合的智能加速
- 边缘函数,可以在节点上跑一小段 JS
- 四层代理和 DNS 解析

接入前的准备
- 腾讯云账号,已完成实名认证。
- 一个可用于接入的域名,比如
lik.cc。EdgeOne 按二级域名建站点,子域名挂在站点下面管理。
备案这一步绕不过去。加速区域选「中国大陆可用区」或「全球可用区」时,域名必须已经完成工信部备案;只有「全球可用区(不含中国大陆)」不要求备案。
接入:三步走完
第一步,新建站点
进 EdgeOne 控制台,在服务总览里新增站点,填入准备好的域名,点「开始接入」。套餐可以回头在计费管理里单独买,第一次接入不必当场下单。


第二步,选套餐
各版本之间的能力差异,官方有对照表:EdgeOne 套餐对比。个人站选个人版基本够用,重点看流量额度、规则条数和自定义规则的能力,不用一上来就买高配。

第三步,选加速区域和接入模式
加速区域决定节点资源落在哪一片:
- 中国大陆可用区:使用中国大陆节点,域名需完成备案。
- 全球可用区:使用全球节点,含中国大陆,同样需要备案。
- 全球可用区(不含中国大陆):只用境外节点,不需要备案,但大陆访问的速度取决于就近落地的是哪个节点。
接入模式有三种,差别主要在谁管 DNS、以及要不要逐个加记录:
| 对比项 | NS 接入 | CNAME 接入 | DNSPod 托管接入 |
|---|---|---|---|
| 适用场景 | 愿意把域名解析整体托管给 EdgeOne | 解析还在原服务商,不想动 NS | 域名本来就托管在腾讯云 DNSPod |
| 接入操作 | 去原服务商改一次 NS 服务器 | 每新增一个子域名,都要手动加一条 CNAME | DNSPod 内状态已生效,后台验证后直接接入 |
| 归属权验证 | 把 NS 改为 EdgeOne 指定地址 | 添加 DNS 记录或 TXT 验证 | 无需验证 |
| 加速后解析 | 直接解析 A 记录到最近的边缘节点 | 通过 CNAME 调度到最近节点 | 通过 CNAME 调度到最近节点 |
官方推荐 NS,理由是解析链路上少一次 CNAME。但如果域名本来就在 DNSPod,我个人更推荐 DNSPod 托管:不用改 NS,也不用逐个加 CNAME,以后新开子域名最省事。我就是这么接的。
针对 Halo 的加速规则
Halo 的页面是服务端渲染出来的,后台接口又全是动态请求,所以规则不能照抄别人的通用模板。原则只有一条:该缓存的缓存,接口和后台一律放过。
下面这套是按 Halo 的路径配的,其他程序按自己的接口路径调整。如果你也用 Halo,照图抄就行。




图看不清的话,记住三条就够:
/upload/*、/themes/*、/plugins/*这些静态路径设成缓存,过期时间给长一点。/apis/*、/login、/logout这些路径不缓存,直接回源。- HTML 页面要么短缓存,要么不缓存,否则发完文章还得手动刷一遍。
用边缘函数自动转 WebP
边缘函数能在节点上跑一小段 JS。我拿它做了一件很实用的事:浏览器支持 WebP 就转成 WebP,不支持就返回原图。老图不用重传,模板也不用改。
在「边缘函数 → 函数管理」里新建函数,代码填这一段:
async function handleEvent(event) {
const { request } = event;
// 获取客户端支持的图片类型
const accept = request.headers.get('Accept');
const option = { eo: { image: {} } };
// 客户端支持 WebP 就转换,否则原样返回
if (accept && accept.includes('image/webp')) {
option.eo.image.format = 'webp';
}
const response = await fetch(request, option);
return response;
}
addEventListener('fetch', event => {
// 函数抛出未处理异常时,请求会原样转发回源站
event.passThroughOnException();
event.respondWith(handleEvent(event));
});


这段代码有两个地方值得留意:
Accept头里没有image/webp就直接回源,老浏览器不会拿到它不认识的格式。passThroughOnException()是保险栓。函数一旦抛异常,请求会原样转发回源站,不会因为一段脚本把全站图片搞挂。
函数建好还得配触发规则,否则它不会执行。找到刚建好的函数,新建一条触发规则:


HOST 填你的站点域名,URL path 填图片的存放路径。图片地址是
www.lik.cc/upload/1.jpg这种,path 就写/upload/*。
给 SVG 单独配一条回源规则
站点里 SVG 多的话,建议给 SVG 单独配一条回源规则,再回到规则引擎里把优先级排好。图片转码这条链路不该管到矢量图,SVG 原样回源最稳,也不会因为转码出错变成空白图标。

按图配就行。
配完先验证,别急着高兴
规则生效与否,跑一条命令就知道了:
curl -o /dev/null -s -w 'DNS %{time_namelookup}s 建连 %{time_connect}s 首字节 %{time_starttransfer}s 总耗时 %{time_total}s\n' https://www.xhhao.com/
- 连续跑几次,命中缓存时的首字节会明显短于回源那一次。两次之间的差值,就是缓存帮你省下的时间。
curl -I看响应头,确认请求确实落在 EdgeOne 节点上,而不是还打在源站。- 最直观的是控制台的「数据分析」:缓存命中率、带宽、请求数都在里面。改规则前后各看一天,效果一目了然。
几个容易踩的坑
- 备案先行。没备案就选大陆或全球可用区,站点根本接不进去,前面配的规则全白搭。
- 规则是按优先级从上往下匹配的,命中就停。后加的规则如果排在前面,很可能把原来的配置整条盖掉。加规则前先看一眼顺序。
- 内容没变化,十有八九是缓存。发完文章、换完封面记得刷一次缓存,或者干脆别缓存 HTML。
- CC 防护会误伤。防护等级开太高,正常爬虫和 RSS 订阅都可能被拦在外面。宁可先低一档,看几天日志再收紧。
- 回源 Host 要盯一下。一个站点绑多个域名时,回源 Host 配错会变成源站 404,而边缘侧看起来一切正常,很难查。
最后
这篇里的水印和图片压缩,都是我自己写的附件工具箱插件在处理,省掉了每次发图前手动跑一遍的麻烦。插件在这里:Halo 附件工具箱。







评论区