使用 Azure 存储进行廉价静态 Web 托管
快速指南,教您如何通过将 Azure WebApp 服务切换到 Azure Storage 和内容分发网络 (CDN) 托管设置来节省资金。
引言
几个月前我写了这篇文章并发布在我的网站上,现在我想分享给大家。我以前使用 Hugo 和一个 Visual Studio 构建管道(完整细节在此)在 Azure Web Service 上运行我的网站。我对这项服务一直相当满意,然而在2018年底,微软宣布在 Azure 存储上托管静态网站的功能正式可用。在 Azure 存储上托管静态网站有很多好处,其中最主要的因素是成本。
背景
存储的价格极其便宜,特别是当你的网站流量像我的一样很小时。然而,对我来说有一个小小的缺点——从存储账户提供内容时存在一些关于大小写敏感的问题。我们可以通过使用内容分发网络(CDN)来解决这个问题,并且还能享受到从离用户最近的端点提供网站服务的好处,所以何乐而不为呢!

上图从高层级展示了我们想要实现的目标。在我的案例中,我正在迁移我现有的网站,所以我想保持最长的正常运行时间。我还有一个现成的构建管道,我将对其进行修改。在这篇文章中,如果你想从零开始建立这个管道,我会尽量提及可以参考我之前文章的步骤。

首先,让我们创建一个存储账户来提供我们的内容。创建一个新的存储账户,选择你的订阅和资源组,并提供一个名称。位置和访问层级不太重要,因为大部分时间,你的内容应该是从一个端点提供,而不是直接从存储账户提供。

这里重要的设置是账户类型,它必须是 StorageV2
才能使用静态网站功能。

我还按要求指定了从存储账户进行安全数据传输。同样,我认为这不太重要,因为大部分繁重的工作都由 CDN 完成。

存储账户创建后,你会在左侧的设置列表中看到一个静态网站选项。打开它并设置为“已启用”。确保你指定了默认索引文档名称和错误文档路径。这将在 Blob 存储部分创建一个名为 $web
的默认容器。启用此功能后,请确保复制主终结点设置,后面会用到它。现在我们已经准备好了一个存储账户,让我们把内容推送到里面。如果你还没有设置构建管道,请按照我之前的文章进行操作,并将 Azure App Service 部署步骤替换为以下步骤。如果你不想要构建管道,请忽略下一步,并手动将你的内容复制到 $web
目录中。对于任何一种选项,你都必须确保你的所有内容都是小写。

我们需要通过将 Azure App Service 部署替换为 Azure 文件复制步骤来从构建管道中部署我们的文件。确保源与之前相同,即 $(Build.SourcesDirectory)\docs
,并为你的环境和存储账户选择相关设置。这里另一个值得注意的部分是 Blob 前缀。通过在这里使用 Blob 前缀设置,并在后续配置中进行镜像,可以在同一个存储账户中运行多个网站。如果你想这样做,现在就设置一个 Blob 前缀值。运行你的管道,并检查以确保你的存储账户现在正在提供网页服务。

现在我们正在提供网页服务,让我们在前端连接一个 CDN。选择一个新的 CDN,指定相同的订阅和资源组,并确保定价层设置为 Premium Verizon,这样你就可以访问高级规则系统。

CDN 设置好后,为你托管的每个网站创建一个终结点。为了利用存储账户内置的静态托管功能,你不希望源类型是存储,而应将其设置为自定义。将源主机名和主机头指定为存储账户的主终结点。如果你在构建管道中使用了 Blob 前缀,或者在 $web
文件夹中使用“子文件夹”来存放不同的网站,请在源路径中指定一个额外的文件夹。我关闭了 HTTP,只是为了强制端到端的 SSL。

我们现在要指定 CDN 规则来执行两个特定的任务:将所有流量重定向到 HTTPS,以及将所有 URL 更改为小写。打开你创建的 CDN 终结点,选择高级功能设置,然后点击“管理”。在“HTTP Large”标题下打开规则引擎。

首先,添加一个新规则,检查传入的请求方案是否为 Http。然后添加一个执行 URL 重定向的功能,代码为 301。然后使用语法 origin-path/(.*)
将任何路径映射到 https 终结点,语法为 https://%(host)/$1
。

其次,我们需要添加一个“If always”规则,它将任何 URL 请求重写为小写。对于你的 CDN 上的每个终结点,使用“all”语法 (.*)
将目标重新映射为小写,语法为 $L1
。保存这些规则需要几个小时才能生效,所以让我们在停下来等待其传播之前再继续进行一些操作。

我们的下一步是将我们的 CDN 终结点与我们的域名关联起来。为了在生产环境中这样做以确保没有停机时间,我们首先需要创建一个验证 CNAME
记录。这允许我们将一个域名(www.<domainname>
)与 Azure CDN 终结点关联,而暂时不移动域名。你需要在你的 DNS 主机上做类似的事情(上面的截图来自 GoDaddy)。如果你正在设置一个新域名,只需为 www 创建一个直接指向 Azure CDN 终结点的 CNAME
记录。

下一步是将你的 CDN 与你的自定义域关联起来。打开你的 CDN 终结点,点击“自定义域”,并指定你的自定义主机名。

启用后,打开你的自定义主机名,并为“自定义域 HTTPS”点击“开”。

为你的自定义域申请证书的过程可能需要相当长的时间,所以现在是离开并让这个过程运行很长一段时间的好时机(我个人会至少让它运行一夜)。如果你正在设置一个新域名,这个过程会自动发生。如果你正在迁移一个网站,你会收到一封来自 Digicert 的邮件,如下所示:

这里需要注意的是,如果你的 WHOIS 联系点不是机器可读的(被隐藏,或者在 GoDaddy 上需要人工验证码过程),你必须设置并能够使用以下电子邮件地址之一:
admin@<domain>
administrator@<domain>
webmaster@<domain>
postmaster@<domain>

整个过程完成后,你的域名应该已经全部验证通过。

最后一步是,如果你还没有这样做,现在就用一条 CNAME
记录将你的 www 条目重定向到该终结点。
最后说明
我已经在这个 CDN 上运行这个网站几个月了,没有任何问题。我的成本从每天大约4美元降到了每天1美分或零成本。如果这个网站的流量增加,成本可能会略有上升,但即使是我最激进的计算,即每个终结点存储1GB和传输1GB,每月也只需3.5美元。
如果你尝试过这个教程或者对其进行了改进,请告诉我。我很想看看如何能进一步完善它。
历史
- 2019年7月25日:初始版本