我的 CDN 被薅之后,我接入了阿里云 ESA
这篇博客记录了我从 CDN 迁移至阿里云 ESA 的过程,并对该技术进行了简单入门介绍。
前几天我的 CDN 因为异常流量欠费了,修复完成后我写了一篇博客《花墨的 CDN 被"薅干了"》
评论区有很多朋友向我推荐了阿里云 ESA/腾讯云 Edge One,非常感谢你们的建议。
当你们看到这篇文章的时候花墨应该已经部署好阿里云 ESA 了。
这确实是一项很不错的技术,所以我想简单介绍一下什么是阿里云 ESA,以及我是如何部署的。
如果你正在使用 CDN,或者希望提升个人网站的安全性,可以参考一下我的迁移过程。
什么是 ESA ?
ESA 的全称是 Edge Security Acceleration,中文名为 边缘安全加速
它是阿里云推出的新一代边缘安全加速平台,在 CDN 加速能力的基础上,进一步融合了安全防护和边缘计算能力。
CDN 主要负责“把内容放到离用户近的地方”;ESA 则是在此基础上,进一步负责“加速 + 防护 + 在边缘节点处理请求”。
对于个人博客这种小型站点来说,ESA 提供了更多开箱即用的安全能力。
为什么选择 ESA ?
抛开评论区很多朋友推荐这个因素,ESA 在提供更多安全和边缘能力的同时,对于部分个人站点场景,成本也可能更低。
况且 ESA 并不只是“更快的 CDN”这么简单,如果把 CDN 理解成:
“帮我把文件放到离用户近的服务器。”
那么 ESA 可以理解成:
“我把整个网站的网络入口放到阿里云的边缘网络上。”
尤其对于花墨这样的前后端分离博客来说,ESA 有一个特殊的能力:边缘计算,这是普通 CDN 基本没有的。
例如用户访问:
https://example.com/blog/all
传统架构:
用户
↓
CDN
↓
源站
↓
NestJS
↓
返回结果
而 ESA 可以把一部分代码直接部署到边缘节点:
用户
↓
ESA节点
↓
边缘规则/函数处理
↓
必要时请求源站 NestJS
↓
返回结果
也就是说:
代码本身也可以离用户更近。
ESA 部署过程
在这里我分享一下我的 ESA 是如何部署的,比我想象中要简单许多。
不过在此之前你可能需要通过添加一条 TXT 记录来证明你对站点的所有权。
新增站点
首先要前往阿里云的 边缘安全加速控制台 - 站点管理,点击新增站点
输入站点
输入需要接入 ESA 的域名,例如flowersink.com,点击下一步。
选择区域和接入方式
获得加速与保护的区域,我选择的是全球,因为我的网站有中国备案,同时有一些朋友在外国。
接入方式我选择的 CNAME,这是传统的 CDN 接入方式,因为我之前接入过,所以我更熟悉,也更方便。
如果是新站点,我更推荐使用 NS 接入,因为可以完整使用 ESA 的 DNS 和安全能力;已有 CDN 用户迁移则 CNAME 更方便。
选择套餐类型
你可以从图中看出各个套餐的区别,个人博客通常选择免费版、基础版就完全足够了。

我为主站域名和 API 域名都部署了基础版,其中基础版和我的 API 域名适配性很高,我打算长期开通。
但我的主站似乎用免费版就够了,虽然也不贵,但好像没必要……不知道你们有没有什么建议。
配置向导
站点添加完成后,点进具体的站点,推荐点击显示配置向导,按照向导内容进行配置。

DNS配置
首先你点击“快速添加DNS记录”来进行添加一条A/AAAA记录,配置源站地址,让 ESA 知道请求最终需要回源到哪里。
主机记录根据域名前缀填写,例如我的主站域名就填写@,记录值/源站填写自己的服务器 IP,进入下一步。

编辑记录选择适合的选项,例如我主站选择的是网站页面、API 选择的是 API 加速

添加完成后,你可以在下面的记录中看到一条代理加速记录,有一栏 CNAME,复制对应的值。
来到云解析 DNS,将之前配置的 CDN 对应的域名 CNAME 记录值替换为刚刚复制的值。
如果你没有接入过 CDN,新增一条 CNAME 记录值即可。
等解析生效后,ESA 就成功接入了。
现在你的域名就从指向 CDN,变成了指向 ESA。
性能配置
这里主要指的是边缘缓存过期时间这一项
我选择的是优先遵循源站缓存策略(如果存在),否则使用自定义缓存 TTL
我在服务器NGINX对于各个域名及目录都有指定的缓存,例如更新频繁的文件缓存时间只有一天,更新频率较低的文件(博客引用图片)设置了一个月。
自动缓存 TTL 默认为 1 个月,具体默认值可能随产品策略调整。
智能路由要钱,且我不清楚具体的效果,所以我没开。
安全配置
我的博客证书主要在 OHTTPS 进行自动续费和配置,在之前配置CDN的时候我就已经存放了自己的证书文件,所以在 ESA 配置的时候直接选择即可。
OHTTPS 负责证书申请和维护,ESA负责使用该证书提供 HTTPS 访问

智能限频我选择的中等,执行动作JS挑战
防盗刷我选择的是观察,因为我暂时不清楚拦截力度如何,运行一段时间看看数据再做决定。

用量安全
我建立了两条用量封顶规则:
每 5 分钟若站点流量 > 1GB,就停用站点。这条是为了防止快速的恶意读取流量。
每天若站点流量 > 20GB,就停用站点。这条是为了防止一整天都有异常流量流出。
有评论区的朋友说,有些爬虫会专门在封顶规则边缘进行爬取,太变态了()
所以这里的规则我其实也暂时没有太好的思路。
验证接入
有许多方法可以验证 ESA 是否成功接入了。
例如验证 DNS:
nslookup flowersink.com
返回结果中会出现 ESA 对应的加速域名(例如 initaf.com 等)
flowersink.com.a1.initaf.com
还可以看 curl 的响应头:
curl -I https://flowersink.com
返回
HTTP/1.1 200 OK
Server: ESA
同时你也能在站点管理的数据概览中看到具体的相应流量,那边说明接入成功了。

成果
在写完这篇博客的时候,API 域名在运行十几个小时后产生约 16.46MB 流量,符合我个人博客 API 的正常使用范围。
ESA 有很多内容可以进行自行设定,例如 AI 爬虫、Bots、缓存、安全规则、流量、代理等等,非常多。
由于我也是个刚开始使用的萌新,更多功能还需要自己慢慢摸索,讲述就只停留在入门的内容。
等我用了一段时间,对各类配置有自己的心得和经验甚至实战经历后,或许我会再写一篇进阶一点的博客!