你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

基线高可用性区域冗余 Web 应用程序

Azure 应用服务
Azure 应用程序网关
Azure 存储
Azure SQL 数据库
Azure 专用链接
Azure 虚拟网络
Azure Monitor

此基线体系结构基于基本 Web 应用程序体系结构,并对其进行扩展,以提供有关在 Azure 上设计安全、区域冗余和高可用的 Web 应用程序的详细指南。 该体系结构使用 Web 应用程序防火墙通过 Azure 应用程序网关公开公共终结点。 它通过专用链接将请求路由到 Azure 应用程序服务。 应用程序服务应用程序可使用虚拟网络集成和专用链接安全地与 Azure PaaS 服务(例如 Azure 密钥保管库和 Azure SQL 数据库)进行通信。

重要

GitHub 徽标 该指导由一个示例实现提供支持,该示例实现展示了 Azure 上的一个基线应用程序服务实现。 在生产的第一步中,此实现是进一步进行解决方案开发的基础。

体系结构

关系图显示了具有区域冗余和高可用性的基线应用程序服务体系结构。

图 1:基线 Azure 应用程序服务体系结构

下载此体系结构的 Visio 文件

组件

此体系结构的许多组件与基本 Web 应用程序体系结构相同。 以下列表仅突出显示对基本体系结构的更改。

  • 应用程序网关是第 7 层 (HTTP/S) 负载均衡器和 Web 流量管理器。 它使用基于 URL 路径的路由跨可用性区域分配传入流量,并卸载加密以提高应用程序性能。
  • Web 应用程序防火墙 (WAF) 是一项云原生服务,可保护 Web 应用免受常见攻击,如 SQL 注入和跨站脚本。 WAF 提供对传入和传出 Web 应用程序的流量的可见性,支持你监视和保护应用程序。
  • Azure 密钥保管库是可安全存储和管理机密、加密密钥与证书的服务。 它集中管理敏感信息。
  • Azure 虚拟网络是一项服务,可用于在 Azure 中创建隔离且安全的专用虚拟网络。 对于应用程序服务上的 Web 应用程序,需要使用虚拟网络子网才能使用专用终结点在资源之间进行网络安全通信。
  • 使用专用链接,客户端能够直接从专用虚拟网络访问 Azure 平台即服务 (PaaS) 服务,而无需使用公共 IP 寻址。
  • Azure DNS 是面向 DNS 域的托管服务,它使用 Microsoft Azure 基础结构提供名称解析。 专用 DNS 区域提供了一种将服务的完全限定域名 (FQDN) 映射到专用终结点的 IP 地址的方法。

网络

网络安全是应用程序服务基线体系结构的核心(请参见图 2)。 网络体系结构可在高级别上确保以下各项:

  1. 客户端流量的单个安全入口点
  2. 筛选网络流量
  3. 使用 TLS 对传输中的数据进行端到端加密
  4. 通过使用专用链接在 Azure 中保留流量,以最大程度地减少数据外泄
  5. 网络资源通过网络分段进行逻辑分组和相互隔离

网络流

关系图显示了基线应用程序服务网络体系结构。

图 2:基线 Azure 应用程序服务应用程序的网络体系结构

下面介绍了流向应用程序服务实例的 Internet 流量入站流,以及从应用程序服务流向 Azure 服务的流。

入站流

  1. 用户向应用程序网关公共 IP 发出请求。
  2. 已评估 WAF 规则。 WAF 规则通过防范跨站脚本 (XSS) 和 SQL 注入等各种攻击对系统可靠性产生积极影响。 如果违反了 WAF 规则,Azure 应用程序网关会向请求者返回一个错误,然后处理将会停止。 如果没有违反 WAF 规则,则应用程序网关会将请求路由到后端池,在本例中,后端池是应用程序服务默认域。
  3. 专用 DNS 区域 privatelink.azurewebsites.net 是链接到虚拟网络的。 DNS 区域具有一个 A 记录,可将应用程序服务默认域映射到应用程序服务专用终结点的专用 IP 地址。 通过此链接的专用 DNS 区域,Azure DNS 可将默认域解析为专用终结点 IP 地址。
  4. 请求会通过专用终结点路由到应用程序服务实例。

应用程序服务到 Azure PaaS 服务流

  1. 应用程序服务向所需 Azure 服务的 DNS 名称发出请求。 可以对 Azure 密钥保管库发出请求以获取机密,对 Azure 存储发出请求以获取发布 zip 文件、Azure SQL 数据库,或支持专用链接的任何其他 Azure 服务。 应用程序服务虚拟网络集成功能可通过虚拟网络路由请求。
  2. 与入站流中的步骤 3 一样,链接的专用 DNS 区域具有将 Azure 服务的域映射到专用终结点专用 IP 地址的 A 记录。 同样,使用此链接的专用 DNS 区域,Azure DNS 可将域解析为服务的专用终结点 IP 地址。
  3. 请求将通过专用终结点路由到服务。

应用程序服务的入口

应用程序网关是可满足此基线体系结构要求的区域资源。 应用程序网关是可缩放的区域性第 7 层负载均衡器,它支持 Web 应用程序防火墙和 TLS 卸载等功能。 在为 Azure 应用程序服务的入口实现应用程序网关时,请考虑以下几点。

  • 使用 Microsoft 托管规则集部署应用程序网关并配置 WAF 策略。 使用防护模式缓解可能导致原点服务(体系结构中的应用程序服务)不可用的 Web 攻击。
  • 实现端到端 TLS 加密
  • 使用专用终结点实现对应用程序服务的入站专用访问
  • 考虑实现应用程序网关的自动缩放,以随时调整来适应动态流量。
  • 请考虑使用不小于 3 的最小缩放实例计数,并始终使用区域支持的所有可用性区域。 虽然应用程序网关是以高度可用的方式部署的,但即使对于单个缩放实例,在失败时创建新的实例也可能最多需要七分钟才能完成。 跨可用性区域部署多个实例有助于确保在出现故障时,可以在运行实例的同时创建新的实例。
  • 在应用程序服务上禁用公用网络访问,以确保网络隔离。 在 Bicep 中,这是通过在属性/siteConfig 下设置 publicNetworkAccess: 'Disabled' 来实现的。

从应用程序服务到 Azure 服务的流

此体系结构将虚拟网络用于应用程序服务,特别是通过虚拟网络将流量路由到专用终结点。 基线体系结构未启用全部流量路由来强制所有出站流量通过虚拟网络,而仅限于内部流量,如流向专用终结点的流量。

不需要从公共 Internet 访问的 Azure 服务应已启用专用终结点,并应禁用公共终结点。 通过允许应用程序服务直接从专用虚拟网络连接到专用链接服务而无需使用公共 IP 寻址,在整个体系结构中使用专用终结点来提高安全性。

在此体系结构中,Azure SQL 数据库、Azure 存储和密钥保管库都禁用了公共终结点。 使用了 Azure 服务防火墙来仅允许来自其他经授权 Azure 服务的流量。 还应使用专用终结点配置其他 Azure 服务,例如 Azure Cosmos DB 和 Azure Redis 缓存。 在此体系结构中,Azure Monitor 不使用专用终结点(虽然可以使用)。

基线体系结构为每个服务实现一个专用 DNS 区域。 专用 DNS 区域包含一条在服务完全限定的域名和专用终结点专用 IP 地址之间映射的 A 记录。 区域链接到虚拟网络。 专用 DNS 区域组可确保自动创建和更新专用链接 DNS 记录。

在实现虚拟网络集成和专用终结点时,请考虑以下几点。

虚拟网络分段和安全

此体系结构中的网络将为应用程序网关、应用程序服务集成组件和专用终结点提供单独的子网。 每个子网都有一个网络安全组,可将这些子网的入站和出站流量限制为仅限所需的流量。 下表显示了基线添加到每个子网的 NSG 规则的简化视图。 表提供了规则名称和函数。

子网 入站 出站
snet-AppGateway AppGw.In.Allow.ControlPlane:允许入站控制平面访问

AppGw.In.Allow443.Internet:允许入站 Internet HTTPS 访问
AppGw.Out.Allow.AppServices:允许对 AppServicesSubnet 进行出站访问

AppGw.Out.Allow.PrivateEndpoints:允许对 PrivateEndpointSubnet 进行出站访问

AppPlan.Out.Allow.AzureMonitor:允许对 Azure Monitor 进行出站访问
snet-PrivateEndpoints 默认规则:允许来自虚拟网络的入站 默认规则:允许出站到虚拟网络
snet-AppService 默认规则:允许来自 vnet 的入站 AppPlan.Out.Allow.PrivateEndpoints:允许对 PrivateEndpointSubnet 进行出站访问

AppPlan.Out.Allow.AzureMonitor:允许对 Azure Monitor 进行出站访问

在实现虚拟网络分段和安全性时,请考虑以下几点。

  • 使用属于带公共 IP 的应用程序网关的子网为虚拟网络启用 DDoS 防护
  • 向每个子网添加 NSG(如果可能)。 应使用最严格的规则来启用完整的解决方案功能。
  • 使用应用程序安全组。 借助应用程序安全组,可以对 NSG 进行分组,并更轻松地为复杂环境创建规则。

虚拟子网架构的一个示例可以是:

类型 名称 地址范围
虚拟网络 地址前缀 10.0.0.0/16
子网 GatewaySubnet 10.0.1.0/24
子网 AppServicesSubnet 10.0.0.0/24
子网 PrivateEndpointsSubnet 10.0.2.0/27
子网 AgentsSubject 10.0.2.32/27

参考 Azure-Samples\app-service-baseline-implementation

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

可靠性

可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述

基线应用程序服务体系结构侧重于关键区域服务的区域冗余。 可用性区域是区域中在物理上独立的位置。 在支持的区域中部署两个或更多实例时,它们可为支持的服务提供区域冗余。 当一个区域处于故障时间时,其他区域可能仍然不受影响。

该体系结构还可确保存在足够的 Azure 服务实例来满足需求。 以下部分提供了适用于体系结构中关键服务的可靠性指导。 这样,可用性区域通过提供高可用性和容错功能来帮助实现可靠性。

应用程序网关

在区域冗余配置中部署 Azure 应用程序网关 v2。 如果发生故障,请考虑使用不小于 3 的最小缩放实例计数,以避免应用程序网关实例的启动时间达到 6 到 7 分钟。

应用程序服务

  • 至少部署三个支持可用性区域的应用程序服务实例。
  • 在应用中实施运行状况检查终结点,并配置应用程序服务运行状况检查功能,以便重新路由发往运行不正常的实例的请求。 有关应用程序服务运行状况检查的详细信息,请参阅使用运行状况检查监视应用程序服务实例。 有关在 ASP.NET 应用程序中实施运行状况检查终结点的详细信息,请参阅 ASP.NET Core 中的运行状况检查
  • 过度预配容量,以便能够处理区域故障。

SQL 数据库

  • 部署 Azure SQL DB 常规用途层、高级层或业务关键层时启用区域冗余。 常规用途、高级和业务关键层支持 Azure SQL DB 中的区域冗余
  • 配置 SQL DB 备份,以使用区域冗余存储 (ZRS) 或异地区域冗余存储 (GZRS)。

Blob 存储

  • Azure 区域冗余存储 (ZRS) 会跨区域中的三个可用性区域同步复制数据。 创建标准 ZRS 或标准 GZRS 存储帐户,确保跨可用性区域复制数据。
  • 为部署、Web 资产和其他数据创建单独的存储帐户,以便可以单独管理和配置帐户。

性能效率

性能效率是指工作负荷能够以高效的方式扩展以满足用户对它的需求。 有关详细信息,请参阅性能效率要素概述

以下部分讨论此体系结构中关键组件的可伸缩性。

应用程序网关

  • 实现自动缩放,以便应用程序网关可以横向扩展或缩减以满足需求。
  • 将最大实例计数设置为高于预期需求的数字。 你只需为所使用的容量单位付费。
  • 设置可以处理小型流量峰值的最小实例计数。 可以使用平均计算单位使用量来计算最小实例计数。
  • 按照有关调整应用程序网关子网大小的指导操作。

应用程序服务

SQL Server

缩放数据库资源是一个复杂的主题,超出了此体系结构的范围。 在缩放数据库时,请考虑以下资源,

其他可伸缩性指导

  • 查看订阅限制和配额,以确保服务按需求进行缩放。
  • 考虑为以下种类数据使用高速缓存,以提高性能和可伸缩性:
    • 半静态事务数据。
    • 会话状态。
    • HTML 输出。 这适用于可呈现复杂 HTML 输出的应用程序。

安全性

基线应用程序服务体系结构侧重于适用于 Web 应用的基本安全建议。 了解加密和标识在每一层的工作方式对于保护工作负载至关重要。

应用程序服务

加密

生产 Web 应用需要使用 HTTPS 加密传输中的数据。 HTTPS 协议依赖于传输层安全性 (TLS),并使用公钥和私钥进行加密。 必须将证书 (X.509) 存储在密钥保管库中,并允许应用程序网关检索私钥。 对于静态数据,一些服务会自动加密数据,而其他服务则允许进行自定义。

传输中的数据

在基线体系结构中,传输中的数据在应用程序服务中是从用户到 Web 应用加密的。 以下工作流介绍了加密在高级别上的工作原理。

关系图显示了基线应用程序服务加密流。

  1. 用户向 Web 应用发送 HTTPS 请求。
  2. HTTPS 请求到达应用程序网关。
  3. 应用程序网关使用密钥保管库中的证书 (X.509) 来创建与用户的 Web 浏览器的安全 TLS 连接。 应用程序网关解密 HTTPS 请求,以便 Web 应用程序防火墙可以对其进行检查。
  4. 应用程序网关使用应用程序服务创建 TLS 连接,以重新加密用户请求。 应用程序服务为 HTTPS 提供本机支持,因此无需将证书添加到应用程序服务。 应用程序网关将加密的流量发送到应用程序服务。 应用程序服务解密流量,Web 应用处理请求。

在配置传输中数据加密时,请考虑以下建议。

  • 创建或将证书上传到密钥保管库。 HTTPS 加密需要使用证书 (X.509)。 需要来自面向自定义域的受信任证书颁发机构的证书。
  • 将证书的私钥存储在密钥保管库中。
  • 按照使用 Azure RBAC 授予应用程序权限以访问 Azure 密钥保管库Azure 资源的托管标识操作,以向应用程序网关提供访问证书私钥的权限。 请勿使用密钥保管库访问策略来提供访问权限。 访问策略仅允许你授予广泛权限,而不仅限于特定值。
  • 启用端到端加密。 应用程序服务是应用程序网关的后端池。 在配置后端池的后端设置时,请通过后端端口 443 使用 HTTPS 协议。
静态数据
  • 使用透明数据加密来加密 Azure SQL 数据库中的敏感数据。 透明数据可加密整个数据库、备份和事务日志文件,并且无需更改 Web 应用程序。
  • 最大程度地降低数据库加密延迟。 要最大程度地降低加密延迟,请将需要保护的数据放置在其自己的数据库中,并仅为该数据库启用加密。
  • 了解内置加密支持。 使用服务器端加密(256 位 AES),Azure 存储可自动加密静态数据。 Azure Monitor 可使用 Microsoft 管理的密钥 (MMK) 自动加密静态数据。

标识和访问管理

应用程序服务基线可为用户标识(用户)和工作负载标识(Azure 资源)配置身份验证和授权,并实现最小特权原则。

用户标识
  • 集成的身份验证机制用于应用程序服务(“EasyAuth”)。 EasyAuth 简化了将标识提供者集成到 Web 应用的过程。 它可在 Web 应用外部处理身份验证,因此无需进行重大代码更改。
  • 配置自定义域的回复 URL。 必须将 Web 应用重定向到 https://<application-gateway-endpoint>/.auth/login/<provider>/callback。 将 <application-gateway-endpoint> 替换为公共 IP 地址或与应用程序网关关联的自定义域名。 将 <provider> 替换为正在使用的身份验证提供商,如代表 Microsoft Entra ID 的“aad”。 可以使用 Azure Front 文档来通过应用程序网关设置此流,或设置应用程序网关
工作负载标识
  • 将托管标识用于工作负载标识。 使用托管标识,开关人员将无需管理身份验证凭据。
  • 使用用户分配的托管标识。 根据征用条件和操作顺序,系统分配的标识可能会导致基础结构即代码部署失败。 可以使用用户分配的托管标识来避免其中一些部署的错误情况。 有关详细信息,请参阅托管标识

卓越运营

卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅卓越运营支柱概述

部署基线应用程序服务应用程序应遵循使用 Azure Pipelines 实现 Azure Web 应用的 CI/CD 中的指导。 除了该指导之外,应用程序服务基线体系结构还考虑到应用程序和部署存储帐户是网络安全的。 体系结构会拒绝对应用程序服务的公共访问。 这意味着无法从虚拟网络外部进行部署。 基线演示了如何使用自托管部署代理在虚拟网络中部署应用程序代码。 以下部署指导侧重于部署应用程序代码,而不是部署基础结构或数据库更改。

关系图显示了基线应用程序服务部署体系结构。

图 3:部署 Azure 应用程序服务应用程序

部署流

  1. 作为发布管道的一部分,管道会在作业队列中发布自托管代理的作业请求。 作业请求是由代理将发布 zip 文件生成项目上传到 Azure 存储帐户。

  2. 自托管部署代理可通过轮询选取新的作业请求。 它会下载作业并生成项目。

  3. 自托管部署代理可通过存储帐户的专用终结点将 zip 文件上传到存储帐户。

  4. 管道将继续运行,托管代理则将选取后续作业。 托管代理将进行 CLI 调用,以将 appSetting WEBSITE_RUN_FROM_PACKAGE 更新为过渡槽的新发布 zip 文件名。

    az webapp config appsettings set -g MyResourceGroupName -n MyUniqueApp --slot staging --settings WEBSITE_RUN_FROM_PACKAGE=UriToNewZip
    
  5. Azure 应用程序服务通过存储帐户专用终结点从存储中拉取新的发布 zip 文件。 暂存实例将使用新包重启,因为 WEBSITE_RUN_FROM_PACKAGE 已设置为不同的文件名。

  6. 管道将继续并运行任何冒烟测试或等待批准。 如果测试通过或获得批准,管道将交换过渡槽和生产槽。

部署指南

下面重点介绍了基线体系结构的关键部署指导。

  • 使用从包运行可避免部署冲突。 当直接从 Azure 应用程序服务中的包运行应用时,包中的文件不会复制到 wwwroot 目录。 而是将 ZIP 包本身直接装载为只读的 wwwroot 目录。 这消除了部署与运行时之间的文件锁定冲突,并确保在任何时候仅运行已完全部署的应用
  • 在已部署的包 zip 文件中包含版本号。 将 WEBSITE_RUN_FROM_PACKAGE appSetting 更新为使用不同文件名的部署包会导致应用程序服务自动选取新版本并重启服务。
  • 使用部署槽位进行可复原代码部署。
  • 请考虑混合使用托管代理和自托管代理。
  • 使用基础结构即代码 (IaC) 自动执行基础结构部署。
  • 使用 Azure 负载测试Azure Chaos Studio 等服务持续验证工作负载以测试整个解决方案的性能和复原能力。

配置

应用程序需要同时使用配置值和机密。 使用以下指导进行配置和机密管理。

  • 切勿将密码或访问密钥等机密签入到源代码管理中。
  • 使用 Azure 密钥保管库存储机密。
  • 使用应用程序服务配置来配置应用程序。 如果需要从应用程序配置中外化配置,或需要功能标记支持,请考虑使用 Azure 应用配置
  • 在应用程序服务配置中使用密钥保管库引用,以在应用程序中安全地公开机密。
  • 如果需要不同的生产和暂存设置,可以创建依附在某个槽位上且不会被交换的应用设置。 交换部署槽位时,默认会交换应用设置。
  • 为本地开发设置本地环境变量,或利用应用程序平台功能。 应用程序服务配置会将应用设置公开为环境变量。 例如,Visual Studio 允许在启动配置文件中设置环境变量。 它还允许使用应用设置和用户机密来存储本地应用程序设置和机密。

监视

监视指收集 IT 系统中的数据并进行分析。 监视的目标是在多个层上实现可观测性,以跟踪 Web 应用的运行状况和安全性。 可观测性是基线应用程序服务体系结构的关键方面。

要监视 Web 应用,需要从应用程序代码、基础结构(运行时)以及平台(Azure 资源)收集和指标和日志并进行分析。 有关详细信息,请参阅 Azure 活动日志Azure 资源日志和应用程序日志。

监视平台

平台监视是从体系结构中的 Azure 服务收集数据。 请考虑以下有关平台监视的指导。

应用程序网关

应用程序网关会监视后端池中资源的健康状况。 使用应用程序网关访问日志收集时间戳、HTTP 响应代码和 URL 路径等信息。 有关详细信息,请参阅应用程序网关默认运行状况探测后端健康状况和诊断日志

应用程序服务

应用程序服务具有内置的集成监视工具,应启用这些工具以提高可观测性。 如果 Web 应用已具有遥测和监视功能(“进程内检测”),则它应继续处理应用程序服务。

  • 启用自动检测。 应用程序服务具有无需更改代码即可启用的检测扩展。 你会获得应用程序性能监视 (APM) 可见性。 有关详细信息,请参阅监视 Azure 应用程序服务性能
  • 启用分布式跟踪。 自动检测提供了通过分布式跟踪和性能探查器监视分布式云系统的方法。
  • 对自定义遥测使用基于代码的检测。 Azure Application Insights 还支持对自定义应用程序遥测使用基于代码的检测。 将 Application Insights SDK 添加到代码并使用 Application Insights API。
  • 启用应用程序服务日志。 应用程序服务平台支持四个附加日志,应启用这些日志以支持故障排除。 这些日志包括应用程序日志、Web 服务器日志、详细的错误消息和失败请求跟踪。
  • 使用结构化记录。 将结构化记录库添加到应用程序代码。 更新代码以使用键值对,并在应用程序服务中启用应用程序日志,以将这些日志存储在 Log Analytics 工作区中。
  • 启用“应用程序服务运行状况”检查。 运行状况检查会将请求从运行不正常的实例中重新路由,并替换运行不正常的实例。 应用程序服务计划需要使用两个或更多实例才能运行运行状况检查。
数据库

调控

通过强制实施体系结构和安全决策,Web 应用会受益于 Azure Policy。 使用 Azure Policy,(1) 可以设置为无法部署(拒绝)或者 (2) 可以轻松检测(审核)配置与首选预期状态的偏离情况。 这有助于捕获基础结构即代码 (IaC) 部署或 Azure 门户偏离商定体系结构的更改。 应将所有资源放置在体系结构中的 Azure Policy 治理下。 尽可能使用内置策略或策略计划来强制实施重要网络拓扑、服务功能、安全性和监视决策,例如:

  • 应用程序服务应禁用公用网络访问
  • 应用程序服务应使用虚拟网络集成
  • 应用程序服务应使用 Azure 专用链接连接到 PaaS 服务
  • 应用程序服务应为 FTP & SCM 网站部署禁用本地身份验证方法
  • 应用程序服务应已禁用远程调试
  • 应用程序服务应用应使用最新的 TLS 版本
  • 应启用适用于应用程序服务的 Microsoft Defender
  • 应为应用程序网关启用 Web 应用程序防火墙 (WAF)

查看更多面向关键服务的内置策略,例如应用程序网关和网络组件应用程序服务密钥保管库监视。 如果内置策略不能完全满足你的需求,可以创建自定义策略或使用社区策略(例如从 Azure 登陆区域)。 当内置策略可用时,首选这些策略。

后续步骤