前言

最近在进行网站的迁移,将博客从Typecho迁移到Halo,其中遇到很多问题,有时间我会单独出一篇文章讲一下迁移过程。

迁移完成后,越来越觉得使用域名:端口号 的访问形式很不优雅,虽然可以在DNS解析使用显性Url转发,避免给他人分享时的麻烦,但网址栏毕竟还是拖了个端口号(隐性url转发不支持转发到https,PASS)。另外,用户可以直接通过域名解析到我本地服务器的IP地址,加上暴露的端口号,有很大的安全隐患。还有,百度、必应的站长工具不支持含有端口号的网址检测无法提供搜索优化。

因此,我的要求是:

  • 能够通过仅域名的方式访问

  • 支持Https

  • 能够使用DDNS

  • 不影响子域名的解析

  • 隐藏服务器真实IP

综上,我决定趁着迁移网站这个机会,解决这个问题。通过查找资料,发现最近出现了一个叫做边缘安全加速的东西,正好能够满足我的要求。

什么是边缘安全加速

这篇文章以腾讯云的EdgeOne为例,介绍了边缘安全加速的一些优势和特点,并进行了简单的配置教学,有兴趣可以看一下:

https://blog.csdn.net/weixin_43890033/article/details/142791159

我的理解:就是套了一层安全防护的CDN。

需要注意的是,我没有在阿里云ESA中找到仅对防护后流量计费或类似意思的说明,使用时应当小心DDos及其他流量攻击。已找到相关描述:

https://help.aliyun.com/zh/edge-security-acceleration/esa/user-guide/ddos?spm=a2c4g.11186623.help-menu-2673927.d_2_9_4.2ee4609b6KLEf7

前提条件

我仅以博客这种轻量化个人网站为例,你需要有下面这些才能够实现ESA的配置:

  • 一个域名,用以解析cdn服务器和你的服务器IP

  • 如果你需要在中国境内进行加速,那么这个域名需要完成备案

  • 域名没有被云服务器厂商封禁,例如含有敏感词等

  • 一台运行着你网站的服务器,可以是云端也可以是本地

  • 一个定位到你服务器的公网IP,可以是动态的也可以是静态的

如果你是公司或者商家想要搭建复杂的网站或者有巨量的访问需求,那这个教程仅供参考,建议你去咨询阿里云客服。

好啦,想必你已经准备好了,我们开始第一步!

ESA服务购买

套餐选择

当然啦,使用ESA肯定要先购买服务,这个服务肯定不是免费的,收费标准如下图所示:

211054.png

套餐具体信息可以前往这里查看:

https://help.aliyun.com/zh/edge-security-acceleration/esa/product-overview/package-function-comparison?spm=a2c4g.11186623.help-menu-2673927.d_0_2_2.a19e6ee9KvYjZA

一般的个人博客选择基础版就足够了,这也是个人比较能够接受的价格。富哥当我没说

另外,阿里云也提供了三个月的基础版免费试用,在这里:

https://free.aliyun.com/?spm=5176.29630154.J__Z58Z6CX7MY__Ll8p1ZOR.2.5b0d4cf8nlZjLz&productCode=dcdn

顺带一提,目前基础版最优惠的是6个月,平均每月5.445元,可以购买5次结束哩~~

当然,你也可以选择腾讯云的EdgeOne,配置方法类似。

操作步骤

进入ESA界面后,点击左侧的站点管理->新增站点

123654.png

输入你的网站主域名,点击下一步:

屏幕截图 2025-03-02 160154.png

选择区域为全球(不同区域价格相同,无脑选全球就完了);由于我要使用DDNS服务,且不能影响子域名的直接解析,因此接入方式选择CNAME

屏幕截图 2025-03-02 160254.png

套餐类型选择基础版,时间三个月(应该是免费的),勾选同意协议后进行支付,之后你应该就能在站点管理界面看到你刚刚添加的站点了。

屏幕截图 2025-03-02 160348.png

域名接入

验证所有权

购买完成后,需要验证域名的所有权。

进入站点管理页面,点击刚刚新建的站点:

屏幕截图 2025-03-02 160628.png

点击DNS->记录 ,提示你需要验证站点所有权,同时它给出了TXT记录值。

进入你的域名解析管理界面(不是ESA中的DNS,在阿里云叫云解析DNS),我以阿里云为例。点击添加记录:

屏幕截图 2025-03-02 161054.png

记录类型为TXT,主机记录、记录值填写刚刚给你的即可;然后点击确定:

屏幕截图 2025-03-02 161215.png

回到ESA界面,点击验证,如果没有问题就会出现下图的提示:

屏幕截图 2025-03-02 160909.png

配置DNS

原理

假设你现在的网站可以通过https://server.com:10086这个网址访问。

我们需要配置DNS解析,使得用户访问https://server.com时指向的为ESA服务器而不是实际服务器(后续称为源站)。

ESA服务器接收到用户请求后,代替用户向源站获取信息,这个流程在ESA的DNS配置界面有很直观的图:

屏幕截图 2025-03-02 162229.png

但如果直接配置ESA的记录值为服务器IP的话,没有办法使用DDNS来更新这条记录,这对于动态公网IP环境是无法接受的。因此,我们需要一个中转,我使用了二级域名

逻辑是这样的:

  • 配置DNS服务器将*.server.com ,即所有二级域名解析到源站地址,这条解析能够使用DDNS更新

  • 配置ESA将server.com解析到任意一个二级域名,例如cdn.server.com

  • 此时,ESA不是直接解析源站IP,而是解析的cdn.server.com 这个二级域名;而它指向的源站IP是可以通过DDNS更新的

这样我们就达到了通过DDNS更新ESA源站IP的效果。

另外,我们还可以在源站上通过二级域名部署私人服务,这些服务不会被ESA中转,直连本地服务器。

操作步骤

首先在云解析DNS添加二级域名的解析,记录类型为A,主机记录为*,记录值为源站IP

屏幕截图 2025-03-02 165500.png

修改你的DDNS服务,使其修改的域名为*.server.com ,如果你不知道怎么配置DDNS,请自行网上搜索,教程很多。

选择ESA中的DNS->记录 ,点击添加记录,按照下图所示配置:

屏幕截图 2025-03-02 170236.png

屏幕截图 2025-03-02 170434.png

上图中的域名就是你的任意一个二级域名。

点击下一步,选择网站页面:

屏幕截图 2025-03-02 170456.png

点击完成,出现配置完成界面:

屏幕截图 2025-03-02 170626.png

点击配置向导,里面会详细的告诉你如何在云解析DNS中配置,我就不赘述了。

测试

配置完成后,你的主域名应当会解析到ESA服务器而不是源站,你可以ping一下试试:

ping server.com

它的输出不应该是你的源站IP,如果是,请刷新一下你电脑的DNS和浏览器的DNS;如果还不行,刷新路由器的DNS;再不行就出去吃个饭,可能你设置的DNS服务器还没有更新。

至此,域名完成接入。

配置回源端口

问题

刚刚我们只是完成了域名接入,实现了主域名解析到ESA节点。

但是,ESA节点默认使用80/443端口访问源站,可是这两个端口并没有运行我们的网站服务,因此我们需要配置回源端口,让ESA节点通过指定的端口号访问源站。

这里提一嘴,ESA节点默认只接受80/443端口的访问请求,所以你之前网站的https://server.com:10086 会失效,具体你可以看这里:

https://help.aliyun.com/document_detail/169688.html#8Yczx

配置方法

https://server.com:10086 这个例子中,我们的回源端口就是10086

进入ESA控制台,选择规则->回源规则->新增规则 :

屏幕截图 2025-03-02 173719.png

规则名称随便填,传入请求类型选择所有传入请求,配置回源协议和端口,回源协议选择HTTPS,端口填10086

屏幕截图 2025-03-02 175203.png

点击确定,这时对于任意一个用户请求,ESA节点都会通过在10086端口的https协议访问源站。

至此,回源端口配置完成。

配置SSL

如果你比较心急,就会发现现在使用https://server.com 还是无法访问网站,这是由于我们还没有配置SSL证书导致的。

配置也比较简单,我就不放图了。

  • SSL/TLS->边缘证书->申请免费证书

  • 输入域名为server.com

  • 点击确定

证书申请完成后,在DNS->记录 你会看到HTTPS证书已经配置。

这时使用https://server.com 就能正常访问你的网站了!

其他配置

按照上述的配置其实已经能够正常使用了,但是还有其他的一些安全、缓存配置我也简单提一下。

缓存规则

既然已经上了ESA,那我不仅希望能够加速页面访问速度,还希望在我网站服务临时关闭调试时,ESA节点能够代替本地服务器,使用已缓存的内容来响应用户请求。这里的配置就是实现上述的功能。

配置方法

首先说明配置方法,具体原理我会在后面讲到。

进入到站点的ESA界面,左侧的规则->缓存规则->新增规则 ,进入界面后,按照下图配置:

屏幕截图 2025-03-03 223636.png

没有展示的选项都保持默认,不要修改。

这条规则的意思是:当用户请求的URI路径不包含/apis/时,执行下方设置的缓存设置;换句话说,当路径包含/apis/时,使用默认缓存规则(见下方原理)。

点击确定,这时访问网站就是经过缓存的了,关闭网站服务后也能够正常打开已被缓存的页面。

原理

接下来说一下这么配置的原因。

正常来讲就算你不配置缓存规则,阿里云也会有一套默认的缓存规则,缓存图片等资源,具体可以看这里:

https://help.aliyun.com/zh/edge-security-acceleration/esa/user-guide/default-cache-rule?spm=a2c4g.11186623.0.0.3e8c1b41whIxZ9

但是,默认的规则不能够实现服务器离线后依然响应用户请求;这个功能只能在缓存规则里配置,即响应过期缓存

听上去只要添加一个全局规则就可以了,对吗?不是的,如果直接添加全局规则,你会发现在编辑文章时,每次保存都会使得已编辑的内容消失。这是因为halo在保存文章时,会先向服务器push当前编辑区的内容,然后再次从服务器GET当前文章的内容并覆盖编辑区。

halo应该没有对这个资源设置缓存时间,导致GET时会从ESA节点获取缓存的数据,而这个缓存数据并没有被刚刚的保存操作所影响,返回的是保存前的数据,这就导致了编辑区内容的消失。

一开始我是直接将控制台路径/console排除缓存,但是问题依旧。经过调试,发现这个GET请求目标是/apis路径下的内容,因此我们只需要将/api排除在缓存规则之外即可。

安全设置

ESA与CDN最大的不同就是套了一个安全的外壳,阿里云默认的配置已经能够防御一定的DDos攻击了,但是还有其他的安全配置没有打开,建议按照教程打开。

配置方法

  • 安全防护->WAF->概述:滑动到下方,开启智能限频。这个是限制单IP的请求频次,能有效防止CC攻击,我设置为中。

  • 安全防护->WAF->托管规则:启用托管规则集。这是防止SQL注入和跨站脚本攻击等攻击方式的,防护等级一般设置为中等即可。

  • 安全防护->WAF->bot:这个对于基础版没有实际作用,不用配置。

资源加速

这里的资源加速不是指的缓存,而是通过使用资源压缩等技术,降低实际传输的流量以加快用户访问。

我们需要手动将这些功能打开。

配置方法

  • 速度和网络:速度优化网络优化全开或按需打开。