65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Azure 存储进行廉价静态 Web 托管

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2019年7月25日

CPOL

7分钟阅读

viewsIcon

8502

快速指南,教您如何通过将 Azure WebApp 服务切换到 Azure Storage 和内容分发网络 (CDN) 托管设置来节省资金。

引言

几个月前我写了这篇文章并发布在我的网站上,现在我想分享给大家。我以前使用 Hugo 和一个 Visual Studio 构建管道(完整细节在此)在 Azure Web Service 上运行我的网站。我对这项服务一直相当满意,然而在2018年底,微软宣布在 Azure 存储上托管静态网站的功能正式可用。在 Azure 存储上托管静态网站有很多好处,其中最主要的因素是成本。

背景

存储的价格极其便宜,特别是当你的网站流量像我的一样很小时。然而,对我来说有一个小小的缺点——从存储账户提供内容时存在一些关于大小写敏感的问题。我们可以通过使用内容分发网络(CDN)来解决这个问题,并且还能享受到从离用户最近的端点提供网站服务的好处,所以何乐而不为呢!

High Level Diagram
高层级示意图

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

New Storage Account
新建存储账户

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

Storage Account Complete
存储账户完成

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

Secure Data Transfer
安全数据传输

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

Static Website
静态网站

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

Deployment Pipeline
部署管道

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

CDN Creation
创建 CDN

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

CDN Endpoint
CDN 终结点

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

CDN Rules
CDN 规则

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

HTTPS Redirect Rule
HTTPS 重定向规则

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

Lowercase Rewrite Rule
小写重写规则

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

CDN Verify Record
CDN 验证记录

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

CDN Custom Domain
CDN 自定义域

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

CDN HTTPS Enable
CDN 启用 HTTPS

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

CDN Certificate Application
CDN 证书申请

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

Certificate Registration Request
证书注册请求

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

  • admin@<domain>
  • administrator@<domain>
  • webmaster@<domain>
  • postmaster@<domain>
CDN Domain Verified
CDN 域已验证

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

CDN CNAME Record
CDN CNAME 记录

最后一步是,如果你还没有这样做,现在就用一条 CNAME 记录将你的 www 条目重定向到该终结点。

最后说明

我已经在这个 CDN 上运行这个网站几个月了,没有任何问题。我的成本从每天大约4美元降到了每天1美分或零成本。如果这个网站的流量增加,成本可能会略有上升,但即使是我最激进的计算,即每个终结点存储1GB和传输1GB,每月也只需3.5美元。

如果你尝试过这个教程或者对其进行了改进,请告诉我。我很想看看如何能进一步完善它。

历史

  • 2019年7月25日:初始版本
© . All rights reserved.