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

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

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

此基线 体系结构基于基本 Web 应用程序体系结构 构建,并提供有关在 Azure 上设计安全、区域冗余和高度可用的 Web 应用的详细指南。 在此体系结构中,具有 Azure Web 应用程序防火墙的 Azure 应用程序网关公开公共终结点,并通过 Azure 专用链接将请求路由到 Azure 应用服务。 应用服务应用程序使用虚拟网络集成和专用链接与 Azure 平台即服务(PaaS)解决方案(例如 Azure Key Vault 和 Azure SQL 数据库)安全通信。

重要

示例实现演示了 Azure 上的此基线应用服务实现。 将其用作生产解决方案的基础。

体系结构

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

下载此体系结构的 Visio 文件

组件

此体系结构与 基本 Web 应用体系结构共享许多组件。 以下列表仅描述不同于或扩展基本体系结构的组件:

  • 应用程序网关 是第 7 层 HTTP 和 HTTPS 负载均衡器和 Web 流量管理器。 在此体系结构中,应用程序网关充当单个公共入口点。 应用程序网关终止传输层安全性(TLS)并评估 Azure Web 应用程序防火墙规则。 然后,它将已批准的请求私下转发到跨可用性区域的应用服务实例。

  • Azure Web 应用程序防火墙 是一种云原生服务,可保护 Web 应用免受常见攻击,例如 SQL 注入和跨站点脚本(XSS)。 在此体系结构中,Azure Web 应用程序防火墙在应用程序网关上运行,并阻止恶意请求到达应用服务。 此设置可提高安全性并帮助维护可用性。

  • Key Vault 是一项服务,可安全地存储和管理机密、加密密钥和证书。 在此体系结构中,它存储应用程序网关使用的 TLS 证书(X.509),并保存应用服务私下访问的应用程序机密。

  • Azure 虚拟网络 是一项服务,可在 Azure 中提供隔离且安全的专用虚拟网络。 在此体系结构中,虚拟网络为应用程序网关提供专用终结点、应用服务集成和专用子网。 此设置隔离流量,并允许应用服务通过专用终结点与依赖的 Azure 服务安全通信。

  • 专用链接 是一种网络服务,通过Microsoft主干网络提供对 Azure 服务的专用访问,以消除对公共 Internet 的暴露。 在此体系结构中,专用链接可实现到应用服务的专用入站连接,以及从应用服务到 Key Vault、SQL 数据库和 Azure 存储等服务的专用出站连接。

  • Azure DNS 是域名系统(DNS)域的托管服务。 它通过使用 Microsoft Azure 基础结构提供名称解析。 专用 DNS 区域将服务的完全限定域名(FQDN)映射到专用终结点的 IP 地址。 在此体系结构中,专用 DNS 区域将应用服务默认域和其他 PaaS 服务域映射到其专用终结点地址,以便所有流量都保留在专用网络上。

网络

网络安全是应用服务基线体系结构的核心。 在高级别上,网络体系结构提供以下功能:

  • 客户端流量的单个安全入口点

  • 通过 Azure Web 应用程序防火墙筛选流量

  • 传输中数据的端到端 TLS 加密

  • 通过专用链接最大程度地减少数据外泄,从而在 Azure 中保留流量

  • 通过网络分段对网络资源的逻辑分组和隔离

网络流

用于显示基线应用服务网络架构中网络流的示意图。

入站流

以下步骤描述从 Internet 到应用服务实例的入站流:

  1. 用户向应用程序网关公共 IP 地址发出请求。

  2. 应用程序网关评估 Web 应用程序防火墙规则,这些规则可防范 XSS 和 SQL 注入等攻击。 如果规则检测到冲突,应用程序网关会向请求者返回错误并停止处理。 否则,应用程序网关会将请求路由到后端池,在本例中为应用服务默认域。

  3. 专用 DNS 区域 privatelink.azurewebsites.net 链接到虚拟网络。 DNS 区域包含 一条 A 记录 ,该记录将应用服务默认域映射到应用服务专用终结点的专用 IP 地址。 Azure DNS 使用此记录将默认域解析为专用终结点 IP 地址。

  4. 应用程序网关通过专用终结点将请求路由到应用服务实例。

外出流量

以下步骤描述了从应用服务到 Azure PaaS 服务的出站流:

  1. 应用服务向所需的 Azure 服务的 DNS 名称(例如 Key Vault、存储、SQL 数据库或支持专用链接的任何其他 Azure 服务)发送请求。 应用程序服务虚拟网络集成功能可通过虚拟网络路由请求。

  2. 与入站流中的步骤 3 类似,链接的专用 DNS 区域包含 一条 A 记录 ,用于将 Azure 服务的域映射到其专用终结点 IP 地址。 Azure DNS 使用此记录将域解析为服务的专用终结点 IP 地址。

  3. 虚拟网络通过专用终结点将请求路由到服务。

不转到 Azure PaaS 服务的出站流量通过多个客户共享的公共 IP 地址离开。 例如,Web 应用可能会在 HTTP 请求期间调用公共 API。 若要控制这种类型的出口流量,请通过 Azure 防火墙等网络设备对其进行路由。 有关详细信息,请参阅 使用 Azure 防火墙控制出站流量

应用程序网关实现

应用程序网关是支持 Azure Web 应用程序防火墙和 TLS 卸载的可缩放区域第 7 层负载均衡器。 为应用服务的入站流量实现应用程序网关时,请考虑以下几点:

从应用服务流向 Azure 服务

此体系结构使用 虚拟网络集成 通过虚拟网络将应用服务流量路由到专用终结点。 基线体系结构不会启用所有流量路由,这会强制所有出站流量通过虚拟网络。 而是仅路由绑定到专用终结点的内部流量。

对于不需要公共 Internet 访问的 Azure 服务,允许专用终结点并阻止公共终结点。 专用终结点通过让应用服务直接从专用虚拟网络连接到专用链接服务,而无需公共 IP 寻址来提高安全性。

在此体系结构中,SQL 数据库、存储和 Key Vault 都阻止了公共终结点。 其服务防火墙仅允许来自其他授权 Azure 服务的流量。 使用私人终结点配置其他 Azure 服务,例如 Azure Cosmos DB 和 Azure Redis 托管服务。 在此体系结构中,Azure Monitor 不使用专用终结点,但可以使用 Azure Monitor 专用链接范围(AMPLS)实现一个终结点。

基线体系结构为每个服务实现一个专用 DNS 区域。 每个专用 DNS 区域都包含一条 A 记录 ,该记录将服务的 FQDN 映射到专用终结点的 IP 地址。 区域链接到虚拟网络。 专用 DNS 区域组会自动为专用终结点创建和更新 DNS 记录。

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

虚拟网络分段和安全

此体系结构中的网络为应用程序网关、应用服务集成组件和专用终结点提供单独的子网。 每个子网上的网络安全组(NSG)仅允许所需的入站和出站流量。 下表介绍了可以添加到每个子网的一系列 NSG 规则。

子网 入站 出站
GatewaySubnet AppGw.In.Allow.ControlPlane:允许入站控制平面访问。

AppGw.In.Allow443.Internet:允许入站 Internet HTTPS 访问。
AppGw.Out.Allow.PrivateEndpoints:允许出站访问 PrivateEndpointsSubnet

AppPlan.Out.Allow.AzureMonitor:允许出站访问 Azure Monitor。
PrivateEndpointsSubnet 默认规则:允许从虚拟网络进行入站访问。 默认规则:允许出站访问虚拟网络。
AppServiceSubnet 默认规则:允许从虚拟网络进行入站访问。 AppPlan.Out.Allow.PrivateEndpoints:允许出站访问 PrivateEndpointsSubnet

AppPlan.Out.Allow.AzureMonitor:允许出站访问 Azure Monitor。

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

  • 为包含具有公共 IP 地址的应用程序网关子网的虚拟网络启用 DDoS 保护

  • 尽可能将 NSG 添加到每个子网。 使用允许完整解决方案功能的最严格规则。

  • 使用 应用程序安全组 以逻辑方式对资源进行分组,从而简化了复杂环境中的 NSG 规则创建。

下表显示了一个示例网络架构。

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

注意事项

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

Reliability

可靠性有助于确保应用程序能够履行对客户的承诺。 有关详细信息,请参阅 可靠性的设计评审清单。

基线应用服务体系结构侧重于关键区域服务的区域性冗余。 可用性区域是区域中提供高可用性和容错的物理独立位置。 在受支持的区域中跨可用性区域部署两个或多个实例时,一个区域的故障不会影响其他实例。 此方法有助于维护服务可用性。

该体系结构还确保有足够的 Azure 服务实例来满足需求。 以下部分为体系结构中的每个关键服务提供可靠性指南。

应用程序网关

在区域冗余配置中部署应用程序网关,最小规模实例计数为 3 个或更多。 多个实例可确保服务在故障期间保持可用状态,而无需等待设置新实例所需的 6 分钟到 7 分钟的启动时间。

App Service

  • 部署至少两个支持可用性区域的应用服务实例。 为了提高复原能力,请为区域中的每个可用性区域至少部署一个实例,以及每个区域中的额外实例以实现冗余。

  • 在应用中实施运行状况检查终结点,并配置应用程序服务运行状况检查功能,以便重新路由发往运行不正常的实例的请求。 有关详细信息,请参阅使用运行状况检查监视应用服务实例ASP.NET Core中运行状况检查

  • 过量配置容量以应对区域故障。

Blob 存储

  • 使用 区域冗余存储(ZRS),该存储在区域内的三个可用区之间同步复制数据。 创建标准 ZRS 或标准异地区域冗余存储(GZRS)存储帐户,以确保跨可用性区域的数据复制。

  • 为部署、Web 资产和其他数据创建单独的存储帐户,以便单独管理和配置每个帐户。

SQL 数据库

  • 在“常规用途”、“高级”或“业务关键”层中部署 SQL 数据库,并启用区域冗余。 这些层支持 区域冗余

  • 将 SQL 数据库备份 配置为使用 ZRS 或 GZRS。

安全性

安全性提供针对故意攻击和滥用宝贵数据和系统的保证。 有关详细信息,请参阅 安全的设计评审清单。

基线应用程序服务体系结构侧重于适用于 Web 应用的基本安全建议。 必须了解加密和标识在每个层的工作原理,以帮助保护工作负荷。

App Service

  • 关闭文件传输协议(FTP)和源代码管理(SCM)站点部署的本地身份验证方法。

  • 禁用远程调试。

  • 使用所有客户端支持的最新 TLS 版本。

  • 打开 Microsoft Defender for App Service 计划

  • 使用最新版的受支持平台、编程语言、协议和框架。

  • 如果需要更高级别的隔离或安全网络访问,请考虑使用应用程序服务环境

加密

生产 Web 应用必须使用 HTTPS 加密传输中的数据。 HTTPS 依赖于 TLS,并使用公钥和私钥进行加密。 将 TLS 证书 (X.509) 存储在 Key Vault 中,并授予应用程序网关检索私钥的权限。 对于静态数据,某些服务会自动加密数据,而另一些服务则允许自定义设置。

传输中的数据

基线体系结构对从用户传输到应用服务中的 Web 应用的数据进行加密。

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

以下工作流介绍了加密在高级别的工作原理:

  1. 用户向 Web 应用发送 HTTPS 请求。

  2. HTTPS 请求到达应用程序网关。

  3. 应用程序网关使用密钥保管库中的证书 (X.509) 来创建与用户的 Web 浏览器的安全 TLS 连接。 应用程序网关解密 HTTPS 请求,以便 Web 应用程序防火墙可以检查它。

  4. 应用程序网关创建与应用服务的 TLS 连接,以重新加密用户请求。 应用服务为 HTTPS 提供本机支持,因此无需将证书添加到应用服务。 应用程序网关将加密的流量发送到应用程序服务。 应用程序服务解密流量,Web 应用处理请求。

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

  • 创建或将证书上传到密钥保管库。 HTTPS 加密需要使用证书 (X.509)。 需要来自面向自定义域的受信任证书颁发机构的证书。

  • 将证书的私钥存储在密钥保管库中。

  • 提供对证书私钥的应用程序网关访问权限。 有关详细信息,请参阅 使用 Azure 基于角色的访问控制(Azure RBAC)Azure 资源的托管标识来授予权限。 请勿使用密钥保管库访问策略来提供访问权限。 访问策略允许你仅授予广泛的权限,而不是特定值。

  • 启用端到端加密。 应用服务是应用程序网关的后端池。 为后端池配置后端设置时,请在后端端口 443 上使用 HTTPS 协议。

静态数据
  • 使用 透明数据加密 加密 SQL 数据库中的敏感数据。 透明数据加密会加密整个数据库、备份和事务日志文件,不需要对 Web 应用进行更改。

  • 将敏感数据置于自己的数据库中,并仅针对该数据库启用加密。 此方法可最大程度地减少数据库加密延迟。

  • 了解内置加密支持。 Azure 存储 通过服务器端加密(256 位高级加密标准(AES)自动加密静态数据。 Azure Monitor 通过Microsoft管理的密钥自动加密静态数据。

调控

Azure Policy 可帮助强制实施 Web 应用的体系结构和安全决策。 它可以阻止部署不符合的资源(拒绝模式)或标记它们进行评审(审核模式)。 此方法有助于监测并识别偏离预期架构的配置漂移,无论这种漂移是通过基础设施即代码(IaC)部署还是 Azure 门户中的手动更改引起的。

将所有资源置于 Azure Policy 治理下的体系结构中。 尽可能使用内置策略或策略计划来强制实施必要的网络拓扑、服务功能、安全性和监视决策。 请考虑以下内置策略:

  • 应用服务应禁用公用网络访问。
  • 应用服务应使用虚拟网络集成。
  • 应用服务应使用专用链接连接到 PaaS 服务。
  • 应用服务应禁用 FTP 和 SCM 站点部署的本地身份验证方法。
  • 应用服务应已关闭远程调试。
  • 应用服务应用应使用最新的 TLS 版本。
  • 应启用 Defender for App Service。
  • 应为应用程序网关启用 Azure Web 应用程序防火墙。

请查看 应用程序网关和网络组件应用服务Key Vault监视组件等关键服务的更多内置策略。 如果内置策略不满足需求,则可以创建自定义策略或使用社区策略,例如 来自 Azure 登陆区域的策略。 尽可能首选内置策略。

标识和访问管理

应用服务基线体系结构为用户标识(用户)和工作负荷标识(Azure 资源)配置身份验证和授权。 它实现最低特权原则。

用户标识
  • 使用 应用服务的集成身份验证机制,也称为 EasyAuth。 EasyAuth 简化了标识提供者与 Web 应用的集成。 它可在 Web 应用外部处理身份验证,因此无需进行重大代码更改。

  • 配置自定义域的回复 URL。 将重定向 URL 设置为 https://<application-gateway-endpoint>/.auth/login/<provider>/callback

    <application-gateway-endpoint> 替换为应用程序网关的公共 IP 地址或自定义域名。 用 <provider> 替换你的身份验证提供程序,例如对于 Microsoft Entra ID,替换为 aad

    有关设置说明,请参阅 Azure Front Door 注意事项设置应用程序网关

工作负载标识
  • 对工作负荷标识使用托管标识。 托管身份无需开发人员管理身份验证凭据。

  • 使用用户分配的托管标识。 系统分配的标识可能会因为竞争条件和操作顺序问题导致 IaC 部署失败。 用户分配的托管标识避免了其中一些部署错误方案。 有关详细信息,请参阅托管标识

卓越运营

卓越运营涵盖部署应用程序并使其在生产环境中运行的运营流程。 有关详细信息,请参阅 卓越运营的设计评审清单。

基线应用服务应用程序的部署遵循 Azure Pipelines 体系结构指南。 由于基线体系结构拒绝公共访问应用服务并保护虚拟网络中的部署存储帐户,因此无法从虚拟网络外部部署。 为了解决此约束,体系结构使用在虚拟网络中运行的自承载部署代理。 以下部署指南侧重于应用程序代码部署,而不是基础结构或数据库更改。

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

部署流

  1. 发布管道将作业请求发布到自承载代理的作业队列。 该作业指示代理将 发布 zip 文件 生成项目上传到存储帐户。

  2. 自托管部署代理轮询队列,获取作业请求,并下载作业和构建工件。

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

  4. 管道将继续运行,托管代理则将选取后续作业。 托管代理 通过命令行接口 (CLI) 调用,将WEBSITE_RUN_FROM_PACKAGE应用设置更新为指向暂存槽的新发布zip文件

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

  6. 管道恢复并运行冒烟测试,或等待手动批准。 成功测试或批准后,管道将交换过渡槽和生产槽。

部署指南

对基线体系结构应用以下部署指南:

  • 直接从应用服务中的包运行部署,以避免部署冲突。 此方法直接将 ZIP 包装载为只读 wwwroot 目录,而不是复制文件。 它消除了部署和运行时之间的文件锁定冲突,并确保仅完全部署的应用运行。

  • 在部署的包 zip 文件名中包含版本号。 更新 WEBSITE_RUN_FROM_PACKAGE 应用设置以引用具有不同文件名的部署包时,应用服务会自动拉取新包并重启。

  • 使用部署槽位实现可靠的代码部署。

  • 请考虑同时使用托管代理和自承载代理。

  • 使用 IaC 自动执行基础结构部署。

  • 使用 Azure 负载测试和 AzureChaos Studio 等服务持续验证工作负荷性能和复原能力。

配置

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

  • 切勿在源代码管理中存储密码或访问密钥等机密。 将机密存储在 Key Vault 中。

  • 应用服务配置中存储应用程序配置。 如果需要外部配置或 功能标志支持,请使用 Azure 应用配置

  • 在应用程序服务配置中使用密钥保管库引用,以在应用程序中安全地公开机密。

  • 如果生产槽和暂存槽需要不同的值,请配置槽特定的应用设置。 默认情况下,应用设置在部署时会与部署槽交换。

  • 使用本地环境变量或特定于平台的功能进行本地开发。 应用服务配置将应用设置公开为环境变量。 使用 Visual Studio 等开发工具可以在启动配置文件中设置环境变量,并通过用户机密为本地设置提供安全存储。

监视

监视从信息技术(IT)系统收集和分析数据,以提供可观测性。 在此体系结构中,监视跟踪跨多个层的 Web 应用运行状况和安全性,这有助于维护可靠的作。

监视三个关键层:

  • 应用程序代码: 跟踪特定于应用程序的遥测和自定义指标。

  • 基础结构(运行时): 监视应用服务运行时环境。

  • 平台(Azure 资源): 从 Azure 服务(例如应用程序网关、SQL 数据库和 Key Vault)收集指标和日志。

有关详细信息,请参阅 Azure 活动日志Azure 资源日志应用服务应用程序日志记录

监视平台

平台监控从架构中的 Azure 服务收集数据。

应用程序网关

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

App Service

应用服务提供内置的集成监视功能,以提高可观测性。 如果 Web 应用已有遥测和监视功能(如进程内检测),这些功能将继续在应用服务上运行。

  • 启用自动检测 以在不更改代码的情况下扩展检测。 此功能提供应用程序性能监视(APM)可见性。 有关详细信息,请参阅 “监视应用服务性能”。

  • 启用分布式跟踪 以跟踪跨多个服务和依赖项的请求。 可以通过分布式跟踪和性能探查器监视分布式云系统。

  • 对自定义遥测使用基于代码的检测。 Application Insights 还支持对自定义应用程序遥测进行基于代码的检测。 将 Application Insights SDK 添加到代码并使用 Application Insights API。

  • 为平台级诊断启用应用服务日志。 应用服务提供四种日志类型用于故障排除:应用程序日志、Web 服务器日志、详细的错误消息和失败的请求跟踪。

  • 使用结构化记录。 将结构化记录库添加到应用程序代码。 更新代码以使用键值对,并在应用服务中打开应用程序日志,将其存储在 Log Analytics 工作区中。

  • 启用应用服务运行状况检查 功能以维护可用性。 运行状况检查会检测到不正常的实例,将流量重新路由到其他实例,并自动替换这些不正常的实例。 此功能需要两个或多个应用服务实例。

数据库

性能效率

性能效率是指工作负荷能够高效地缩放以满足用户需求。 有关详细信息,请参阅 性能效率的设计评审清单。

应用程序网关

  • 实现自动缩放,以便应用程序网关可以横向扩展或缩减以满足需求。

  • 将最大实例计数设置为高于预期需求的数字。 只需为使用的容量单位付费。

  • 设置可以处理小型流量峰值的最小实例计数。 可以使用 平均计算单元使用情况 来计算最小实例计数。

  • 按照 调整应用程序网关子网大小的指引进行操作。

App Service

SQL Database

数据库缩放涉及此体系结构范围之外的许多注意事项。 有关缩放 SQL 数据库的详细信息,请参阅以下资源:

其他可伸缩性指导

  • 查看订阅限制和配额,以确保服务按需求进行缩放。

  • 考虑缓存以下类型的数据以提高性能和可伸缩性:

    • 半静态事务数据
    • 会话状态
    • 复杂的 HTML 输出

后续步骤