目录

林间·栈笔

全面了解腾讯 EdgeOne 边缘加速:加速网站并提高用户体验

腾讯云 EdgeOne 是整合了 DDoS/CC 防护、CDN 加速、边缘函数与 DNS 解析的边缘安全加速平台。文章基于作者 7 个多月个人版使用经验,梳理了接入与配置流程:先完成域名备案(仅境外可用区可免),随后新建站点、选个人版套餐即可;域名已在 DNSPod 的推荐直接托管接入,省去改 NS 与逐条加 CNAME 的麻烦。针对 Halo 站点,静态路径(/upload、/themes 等)建议设长缓存,动态接口(/apis、/login 等)放行回源,HTML 不缓存。边缘函数可依据 Accept 头自动将图片转为 WebP,不支持时回源原图,SVG 需单独配回源规则。验证规则可观察 curl 首字节耗时与控制台命中率。常见坑包括备案缺失、规则优先级覆盖、缓存未刷新、CC 误伤及回源 Host 配错。

  • 2059 次阅读
  • 阅读时长
  • 16 条评论

前言

EdgeOne 最近讨论度挺高,我自己的个人版从去年年底用到现在,七个多月。这篇不是广告,就是把这几个月琢磨出来的配置整理一遍,省得每次有人问起,我都得重新截图讲一遍。

EdgeOne 是什么

腾讯云 EdgeOne 是一套边缘安全加速平台。请求先到离用户最近的边缘节点,静态内容由节点直接返回,动态请求在节点上做一层安全和转发处理再回源。对个人站来说,最直接的收益是首字节变短、源站压力变小,顺带还能挡掉一部分扫描和攻击。

它把原本得分开买的好几样东西合在了一起:

  • DDoS 防护、CC 防护、Web 防护、Bot 管理
  • CDN 静态加速,以及动静态混合的智能加速
  • 边缘函数,可以在节点上跑一小段 JS
  • 四层代理和 DNS 解析
EdgeOne 产品能力总览

接入前的准备

  • 腾讯云账号,已完成实名认证。
  • 一个可用于接入的域名,比如 lik.cc。EdgeOne 按二级域名建站点,子域名挂在站点下面管理。

备案这一步绕不过去。加速区域选「中国大陆可用区」或「全球可用区」时,域名必须已经完成工信部备案;只有「全球可用区(不含中国大陆)」不要求备案。

接入:三步走完

第一步,新建站点

进 EdgeOne 控制台,在服务总览里新增站点,填入准备好的域名,点「开始接入」。套餐可以回头在计费管理里单独买,第一次接入不必当场下单。

控制台新增站点,填写站点域名
站点创建完成后的接入引导

第二步,选套餐

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

套餐选择页面

第三步,选加速区域和接入模式

加速区域决定节点资源落在哪一片:

  • 中国大陆可用区:使用中国大陆节点,域名需完成备案。
  • 全球可用区:使用全球节点,含中国大陆,同样需要备案。
  • 全球可用区(不含中国大陆):只用境外节点,不需要备案,但大陆访问的速度取决于就近落地的是哪个节点。

接入模式有三种,差别主要在谁管 DNS、以及要不要逐个加记录:

对比项NS 接入CNAME 接入DNSPod 托管接入
适用场景愿意把域名解析整体托管给 EdgeOne解析还在原服务商,不想动 NS域名本来就托管在腾讯云 DNSPod
接入操作去原服务商改一次 NS 服务器每新增一个子域名,都要手动加一条 CNAMEDNSPod 内状态已生效,后台验证后直接接入
归属权验证把 NS 改为 EdgeOne 指定地址添加 DNS 记录或 TXT 验证无需验证
加速后解析直接解析 A 记录到最近的边缘节点通过 CNAME 调度到最近节点通过 CNAME 调度到最近节点

官方推荐 NS,理由是解析链路上少一次 CNAME。但如果域名本来就在 DNSPod,我个人更推荐 DNSPod 托管:不用改 NS,也不用逐个加 CNAME,以后新开子域名最省事。我就是这么接的。

针对 Halo 的加速规则

Halo 的页面是服务端渲染出来的,后台接口又全是动态请求,所以规则不能照抄别人的通用模板。原则只有一条:该缓存的缓存,接口和后台一律放过。

下面这套是按 Halo 的路径配的,其他程序按自己的接口路径调整。如果你也用 Halo,照图抄就行。

Halo 静态资源缓存规则
Halo 动态接口放行规则
缓存过期时间设置
规则优先级排序

图看不清的话,记住三条就够:

  1. /upload/*、/themes/*、/plugins/* 这些静态路径设成缓存,过期时间给长一点。
  2. /apis/*、/login、/logout 这些路径不缓存,直接回源。
  3. 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

HOST 填你的站点域名,URL path 填图片的存放路径。图片地址是 www.lik.cc/upload/1.jpg 这种,path 就写 /upload/*。

给 SVG 单独配一条回源规则

站点里 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 节点上,而不是还打在源站。
  • 最直观的是控制台的「数据分析」:缓存命中率、带宽、请求数都在里面。改规则前后各看一天,效果一目了然。

几个容易踩的坑

  1. 备案先行。没备案就选大陆或全球可用区,站点根本接不进去,前面配的规则全白搭。
  2. 规则是按优先级从上往下匹配的,命中就停。后加的规则如果排在前面,很可能把原来的配置整条盖掉。加规则前先看一眼顺序。
  3. 内容没变化,十有八九是缓存。发完文章、换完封面记得刷一次缓存,或者干脆别缓存 HTML。
  4. CC 防护会误伤。防护等级开太高,正常爬虫和 RSS 订阅都可能被拦在外面。宁可先低一档,看几天日志再收紧。
  5. 回源 Host 要盯一下。一个站点绑多个域名时,回源 Host 配错会变成源站 404,而边缘侧看起来一切正常,很难查。

最后

这篇里的水印和图片压缩,都是我自己写的附件工具箱插件在处理,省掉了每次发图前手动跑一遍的麻烦。插件在这里:Halo 附件工具箱。

那年今日11 月 15 日

    评论区

    友链提交
    请认真填写以下信息,谢谢!

    博客信息

    林间拾语
    (请填写完整的网址,例如:https://www.example.com)
    (贵站展示本站链接的页面地址,一般是友链页面,填写后将自动验证友链关系有效性)
    (用于抓取文章)
    (用于接收通知)