重要
在部署或更新应用服务资源提供程序(RP)之前,如有必要,请将 Azure Stack Hub 更新为受支持的版本。 请务必阅读 RP 发行说明,了解可能影响部署的新功能、修补程序和任何已知问题。
| 支持的最低 Azure Stack Hub 版本 | 应用服务 RP 版本 |
|---|---|
| 2311 及更高版本 | 25R1 Installer 25R1 离线包 (发行说明) |
在Azure Stack Hub上部署Azure 应用服务之前,请完成本文中的先决条件步骤。
准备工作
本部分列出了 Azure Stack Hub 集成系统部署的先决条件。
资源提供程序先决条件
如果已安装资源提供程序,则可能已完成以下先决条件,并可以跳过本部分。 否则,请在继续之前完成以下步骤:
向 Azure 注册 Azure Stack Hub 实例(如果尚未这样做)。 你需要将Azure Stack Hub实例注册到 Azure,因为你将连接到Azure并从市场下载项。
如果不熟悉 Azure Stack Hub 管理员门户的“市场管理”功能,请参阅从 Azure 下载市场项并将其发布到 Azure Stack Hub。 此文逐步讲解如何将项目从 Azure 下载到 Azure Stack Hub 市场。 它涵盖了联网场景和离线场景。 如果 Azure Stack Hub 实例已断开连接或部分连接,则在准备安装时还需要完成其他先决条件操作。
更新 Microsoft Entra 主目录。 从版本 1910 开始,必须在主目录所在的租户中注册一个新的应用程序。 此应用可使 Azure Stack Hub 成功创建并将较新的资源提供程序(例如事件中心等)注册到你的 Microsoft Entra 租户中。 升级到内部版本 1910 或更高版本后,需要执行此操作。 如果未完成此步骤,市场资源提供程序安装会失败。
- 成功将 Azure Stack Hub 实例更新到 1910 或更高版本后,请按照克隆/下载 Azure Stack Hub Tools 存储库的说明。
- 然后,请按照更新 Azure Stack Hub Microsoft Entra 主目录(在安装更新或新的资源提供程序之后)的说明一文进行操作。
安装程序和帮助器脚本
下载 Azure Stack Hub 上的应用服务部署帮助器脚本。
注意
部署帮助程序脚本要求使用 AzureRM PowerShell 模块。 有关安装详细信息,请参阅 为 Azure Stack Hub 安装 PowerShell AzureRM 模块。
提取帮助器脚本 .zip 文件中的文件。 会提取以下文件和文件夹:
- Common.ps1
- Create-AADIdentityApp.ps1
- Create-ADFSIdentityApp.ps1
- Create-AppServiceCerts.ps1
- Get-AzureStackRootCert.ps1
- BCDR
- ReACL.cmd
- 模块文件夹
- GraphAPI.psm1
证书和服务器配置(集成系统)
本部分列出了集成系统部署的先决条件。
证书要求
若要在生产环境中运行资源提供程序,必须提供以下证书:
- 默认域证书
- API 证书
- 发布证书
- 标识证书
除了以下部分中列出的特定要求外,稍后还使用工具来测试常规要求。 有关完整的验证列表,请参阅验证 Azure Stack Hub PKI 证书,包括:
- .PFX 文件格式
- 密钥用法设置为服务器和客户端身份验证
- 还有几个。
默认域证书
将默认域证书置于前端角色上。 对 Azure 应用服务发出通配符或默认域请求的用户应用使用此证书。 该证书还保护源代码管理操作(Kudu)。
该证书必须采用 .pfx 格式,并且应该是包含三个使用者的通配符证书。 此要求允许一个证书同时涵盖用于源代码管理操作的默认域和 SCM 终结点。
| 格式 | 示例 |
|---|---|
*.appservice.<region>.<DomainName>.<extension> |
*.appservice.redmond.azurestack.external |
*.scm.appservice.<region>.<DomainName>.<extension> |
*.scm.appservice.redmond.azurestack.external |
*.sso.appservice.<region>.<DomainName>.<extension> |
*.sso.appservice.redmond.azurestack.external |
API 证书
将 API 证书置于管理角色上。 资源提供程序使用它来帮助保护 API 调用。 用于发布的证书必须包含匹配 API DNS 条目的使用者。
| 格式 | 示例 |
|---|---|
| api.appservice.<region>.<DomainName>.<扩展> | api.appservice.redmond.azurestack.external |
发布证书
发布者角色的证书在上传内容时保护应用所有者的 FTPS 流量。 用于发布的证书必须包含匹配 FTPS DNS 条目的使用者。
| 格式 | 示例 |
|---|---|
| ftp.appservice.<region>.<DomainName>.<扩展名> | ftp.appservice.redmond.azurestack.external |
标识证书
标识应用的证书可以实现:
- Microsoft Entra ID 或 Active Directory 联合身份身份验证服务 (AD FS) 目录、Azure Stack Hub 与应用服务 之间的集成,以支持与计算资源提供程序的集成。
- Azure Stack Hub 上的 Azure 应用服务内高级开发工具的单一登录场景。
身份验证证书必须包含符合以下格式的主题。
| 格式 | 示例 |
|---|---|
| sso.appservice.<region>.<DomainName>.<扩展名> | sso.appservice.redmond.azurestack.external |
验证证书
在部署应用服务资源提供程序之前,通过使用 PowerShell 库 提供的Azure Stack Hub就绪情况检查器工具,对证书的使用进行评估。 Azure Stack Hub 准备情况检查器工具验证生成的 PKI 证书是否适用于应用服务部署。
最佳做法是,使用任何必要的 Azure Stack Hub PKI 证书时,请计划足够的时间来测试并在必要时重新颁发证书。
准备文件服务器
Azure 应用服务需要文件服务器。 对于生产部署,必须将文件服务器配置为高度可用且能够处理故障。
高可用文件服务器和 SQL Server 快速入门模板
引用体系结构快速入门模板现已可用于部署文件服务器和SQL Server。 此模板在配置为支持 Azure Stack Hub 上的 Azure 应用服务高可用性部署的虚拟网络中支持 Active Directory 基础结构。
重要
Azure Stack Hub操作员管理这些服务器,尤其是在生产环境中。 应根据需要或组织要求配置模板。
注意
集成系统实例必须能够从GitHub下载资源才能完成部署。
部署自定义文件服务器的步骤
重要
如果选择在现有虚拟网络中部署应用服务,请将文件服务器部署到与应用服务不同的子网中。
注意
如果选择使用前面提到的任一快速入门模板来部署文件服务器,则可以跳过此部分,因为文件服务器配置为模板部署的一部分。
在 Active Directory 中预配组和帐户
创建以下 Active Directory 全局安全组:
- FileShareOwners
- FileShareUsers
创建以下 Active Directory 帐户作为服务帐户:
- FileShareOwner
- 文件共享用户
作为安全最佳做法,请对这些帐户(以及所有 Web 角色)使用唯一用户,并使用强用户名和密码。 根据以下条件设置密码:
- 启用“密码永不过期”。
- 启用“用户不能更改密码”。
- 禁用“用户在下次登录时必须更改密码”。
如下所述将帐户添加到组成员身份:
- 将 FileShareOwner 添加到 FileShareOwners 组。
- 将 FileShareUser 添加到 FileShareUsers 组。
在工作组中预配组和帐户
注意
配置文件服务器时,请从管理员命令提示符运行以下命令。 请勿使用 PowerShell。
使用 Azure 资源管理器模板时已创建用户。
运行以下命令以创建 FileShareOwner 和 FileShareUser 帐户。 将
<password>替换为自己的值。net user FileShareOwner <password> /add /expires:never /passwordchg:no net user FileShareUser <password> /add /expires:never /passwordchg:no运行以下 WMIC 命令,将帐户密码设为永不过期:
WMIC USERACCOUNT WHERE "Name='FileShareOwner'" SET PasswordExpires=FALSE WMIC USERACCOUNT WHERE "Name='FileShareUser'" SET PasswordExpires=FALSE创建本地组 FileShareUsers 和 FileShareOwners,并在第一步中添加帐户:
net localgroup FileShareUsers /add net localgroup FileShareUsers FileShareUser /add net localgroup FileShareOwners /add net localgroup FileShareOwners FileShareOwner /add
预配内容共享
内容共享包含租户网站内容。 在单个文件服务器上预配内容共享的过程与在 Active Directory 和工作组环境中相同。 对于 Active Directory 中的故障转移群集,情况则有所不同。
在单个文件服务器上(Active Directory 或工作组)预配内容共享
在单个文件服务器上,在提升的命令提示符下运行以下命令。 将 C:\WebSites 的值替换为环境中的相应路径。
set WEBSITES_SHARE=WebSites
set WEBSITES_FOLDER=C:\WebSites
md %WEBSITES_FOLDER%
net share %WEBSITES_SHARE% /delete
net share %WEBSITES_SHARE%=%WEBSITES_FOLDER% /grant:Everyone,full
配置共享访问控制
在文件服务器上,或在当前拥有群集资源的故障转移群集节点上的提升权限命令提示符中,运行以下命令。 将变量替换为特定于环境的值。
Active Directory
set DOMAIN=<DOMAIN>
set WEBSITES_FOLDER=C:\WebSites
icacls %WEBSITES_FOLDER% /reset
icacls %WEBSITES_FOLDER% /grant Administrators:(OI)(CI)(F)
icacls %WEBSITES_FOLDER% /grant %DOMAIN%\FileShareOwners:(OI)(CI)(M)
icacls %WEBSITES_FOLDER% /inheritance:r
icacls %WEBSITES_FOLDER% /grant %DOMAIN%\FileShareUsers:(CI)(S,X,RA)
icacls %WEBSITES_FOLDER% /grant *S-1-1-0:(OI)(CI)(IO)(RA,REA,RD)
工作组
set WEBSITES_FOLDER=C:\WebSites
icacls %WEBSITES_FOLDER% /reset
icacls %WEBSITES_FOLDER% /grant Administrators:(OI)(CI)(F)
icacls %WEBSITES_FOLDER% /grant FileShareOwners:(OI)(CI)(M)
icacls %WEBSITES_FOLDER% /inheritance:r
icacls %WEBSITES_FOLDER% /grant FileShareUsers:(CI)(S,X,RA)
icacls %WEBSITES_FOLDER% /grant *S-1-1-0:(OI)(CI)(IO)(RA,REA,RD)
准备 SQL Server 实例
注意
如果选择为高可用性文件服务器和SQL Server部署快速入门模板,则可以跳过本部分,因为模板在 HA 配置中部署和配置SQL Server。
对于 Azure Stack Hub 上的 Azure 应用服务托管和计量数据库,必须准备 SQL Server 实例,用于存放应用服务数据库。
出于生产和高可用性目的,请使用完整版 SQL Server 2016 SP3 或更高版本,启用混合模式身份验证,并在 高可用性配置中部署。
所有应用服务角色都必须访问Azure Stack Hub上的Azure 应用服务 SQL Server实例。 可以在 Azure Stack Hub 中的默认提供程序订阅中部署SQL Server。 或者,只要连接到 Azure Stack Hub,就可以在组织中使用现有基础结构。 如果使用 Azure 市场映像,请记得相应地配置防火墙。
注意
通过市场管理功能可以获取多种 SQL IaaS VM 映像。 在使用市场项部署 VM 之前,请确保下载最新版本的 SQL IaaS 扩展。 SQL 映像与 Azure 中提供的 SQL VM 相同。 对于从这些映像创建的 SQL VM,IaaS 扩展和相应的门户增强功能可提供自动修补和备份等功能。
对于任何 SQL Server 角色,可以使用默认实例或命名实例。 如果使用命名实例,请务必手动启动SQL Server浏览器服务并打开端口 1434。
应用服务安装程序会检查并确认 SQL Server 已启用数据库包含功能。 若要在承载应用服务数据库的SQL Server上启用数据库包含,请运行以下 SQL 命令:
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO
所需文件服务器和 SQL Server 的许可问题
Azure Stack Hub 上的 Azure 应用服务需要文件服务器和 SQL Server 才能运行。 可以使用位于Azure Stack Hub部署外部的预先存在的资源,或在Azure Stack Hub默认提供程序订阅中部署资源。
如果您选择在 Azure Stack Hub 默认的提供程序订阅中部署这些资源,则 Azure Stack Hub 上 Azure 应用服务 的费用已包含这些资源的许可证费用(Windows Server 许可证和 SQL Server 许可证),但须遵循以下限制条件:
- 将基础结构部署到默认提供程序订阅中。
- Azure Stack Hub 上的 Azure 应用服务 资源提供程序仅使用基础结构。 不允许任何其他工作负载、管理类工作负载(例如其他资源提供程序,如 SQL-RP)或租户工作负载(例如需要数据库的租户应用)使用此基础设施。
文件和 SQL 服务器的运营责任
云操作员负责文件服务器的维护和操作,并SQL Server。 资源提供程序不管理这些资源。 云操作员负责备份应用服务数据库和租户内容文件共享。
检索 Azure Stack Hub 的 Azure 资源管理器根证书
在能够访问 Azure Stack Hub 集成系统特权终结点的计算机上,打开提升权限的 PowerShell 会话。
在你解压辅助脚本的文件夹中运行 Get-AzureStackRootCert.ps1 脚本。 此脚本在应用服务所需的、用于创建证书的脚本所在的同一文件夹中创建一个根证书。
运行以下 PowerShell 命令时,请提供 AzureStack\CloudAdmin 的特权终结点和凭据:
Get-AzureStackRootCert.ps1
Get-AzureStackRootCert.ps1 脚本参数
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
PrivilegedEndpoint |
必需 | AzS-ERCS01 | 特权终结点 |
CloudAdminCredential |
必需 | AzureStack\CloudAdmin | Azure Stack Hub 云管理员的域帐户凭据。 |
网络和标识配置
Azure Stack Hub上Azure 应用服务的网络和标识配置涉及设置必要的网络基础结构和标识管理来支持资源提供程序。
虚拟网络
注意
预创建自定义虚拟网络是可选的。 Azure Stack Hub上的Azure 应用服务可以创建所需的虚拟网络,但随后必须通过公共 IP 地址与 SQL 和文件服务器通信。 如果使用应用服务 HA 文件服务器和SQL Server快速入门模板部署必备 SQL 和文件服务器资源,该模板还会部署虚拟网络。
Azure Stack Hub上的Azure 应用服务使你可以将资源提供程序部署到现有虚拟网络或创建虚拟网络作为部署的一部分。 如果使用现有虚拟网络,则可以通过内部 IP 连接到 Azure Stack Hub 上的 Azure 应用服务 所需的文件服务器和 SQL Server。 在Azure Stack Hub上安装Azure 应用服务之前,请使用以下地址范围和子网配置虚拟网络:
虚拟网络 - /16
子网
- ControllersSubnet /24
- ManagementServersSubnet /24
- FrontEndsSubnet /24
- PublishersSubnet /24
- WorkerSubnet /21
重要
如果选择在现有虚拟网络中部署应用服务,请将SQL Server部署到独立于应用服务和文件服务器的子网中。
创建标识应用程序以启用 SSO 方案
Azure 应用服务使用标识应用程序(服务主体)来支持以下操作:
- 辅助角色层上的虚拟机规模集集成。
- Azure Functions 门户和高级开发人员工具 (Kudu) 的 SSO。
根据 Azure Stack Hub 使用的标识提供程序(Microsoft Entra ID 或 Active Directory 联合身份验证服务 (AD FS)),按照相应步骤创建供 Azure Stack Hub 资源提供程序上的 Azure 应用服务 使用的服务主体。
创建 Microsoft Entra 应用
请按照以下步骤在您的 Microsoft Entra 租户中创建服务主帐号:
以 azurestack\AzureStackAdmin 身份打开 PowerShell 实例。
转到在先决条件步骤中下载并提取的脚本所在的位置。
运行 Create-AADIdentityApp.ps1 脚本。 出现提示时,输入用于Azure Stack Hub部署的Microsoft Entra租户 ID。 例如,输入 myazurestack.partner.onmschina.cn。
在“凭据”窗口中,输入 Microsoft Entra 服务管理帐户和密码。 选择“确定”。
输入 前面创建的证书的证书文件路径和证书密码。 默认情况下,为此步骤创建的证书为 sso.appservice.local.azurestack.external.pfx。
记下 PowerShell 输出中返回的应用程序 ID。 使用以下步骤中的 ID 来为应用程序的权限提供许可,以及在安装过程中提供许可。
打开新的浏览器窗口,以 Microsoft Entra 服务管理员的身份登录到Azure 门户。
打开 Microsoft Entra 服务。
在左侧窗格中选择“应用注册”。
搜索在步骤 7 中记下的应用程序 ID。
从列表中选择“应用服务应用程序注册”。
在左侧窗格中选择“API 权限”。
选择 为 <tenant> 授予管理员同意,其中
<tenant>是你的 Microsoft Entra 租户的名称。 通过选择是来确认同意授予。对于多租户场景,请运行以下 PowerShell 脚本,使用 Azure 资源管理器 管理员终结点向应用服务的应用注册授予 Directory.Read.All 和 user_impersonation 权限。
# Build the admin endpoint by replacing the region and the FQDN with the values specific to your system $adminarmendpoint = https://adminmanagement.<region>.<FQDN>/ Add-AzEnvironment -Name "AzureStackAdmin" -ArmEndpoint $userarmendpoint # Home directory $AADTenantName = "xxx" $authEndpoint = (Get-AzEnvironment -Name "AzureStackAdmin").ActiveDirectoryAuthority.TrimEnd('/') $TenantId = (invoke-restmethod "$($AuthEndpoint)/$($AADTenantName)/.well-known/openid-configuration").issuer.TrimEnd('/').Split('/')[-1] Login-AzAccount -EnvironmentName "AzureStackAdmin" -TenantId $TenantID # Enter the region name of your Azure Stack Hub system $Location = '<region>' $AppServicesAppId = '' # the identity app's application id, use Azure portal to obtain it - Entra ID - App Registration - App Services - Application ID $AppServicesObjectId = '' # the identity app's object id, use Azure portal to get it - Entra ID - App Registration - App Services - Object ID # The property 'applicationId' in the json returned from 'https://<AdminArmEndpoint>/metadata/identity?api-version=2015-01-01' $TenantArmAppId = (Invoke-WebRequest "$adminarmendpoint/metadata/identity?api-version=2015-01-01" -UseBasicParsing | select -ExpandProperty Content | ConvertFrom-Json | select applicationId).applicationId $params = @{ ResourceGroupName = "system.$Location" ResourceType = 'Microsoft.Subscriptions.Providers/applicationRegistrations' ResourceName = 'AppService' ApiVersion = '2018-05-01' Location = $Location Properties = @{ appId = $AppServicesAppId objectId = $AppServicesObjectId appRoleAssignments = @(@{ client = $AppServicesAppId roleId = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well known value for the 'Directory.Read.All' permission resource = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well known value for Microsoft.Azure.ActiveDirectory }) oAuth2PermissionGrants = @(@{ client = $AppServicesAppId resource = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well known value for Microsoft.Azure.ActiveDirectory scope = 'User.Read Directory.Read.All' }, @{ client = $AppServicesAppId resource = $tenantArmAppId scope = 'user_impersonation' }) } } New-AzResource @params -Verbose -Force执行此脚本后,需要使用应用服务的每个租户都必须重新运行注册脚本。 请参阅在 Azure Stack Hub 中配置多租户。
Create-AADIdentityApp PowerShell 脚本
Create-AADIdentityApp.ps1
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
DirectoryTenantName |
必需 | 零 | Microsoft Entra 租户 ID。 提供 GUID 或字符串。 示例为 myazureaaddirectory.partner.onmschina.cn。 |
AdminArmEndpoint |
必需 | 零 | Azure 资源管理器管理终结点。 示例为 adminmanagement.local.azurestack.external。 |
TenantARMEndpoint |
必需 | 零 | Azure 资源管理器租户终结点。 示例为 management.local.azurestack.external。 |
AzureStackAdminCredential |
必需 | 零 | Microsoft Entra 服务管理员凭据。 |
CertificateFilePath |
必需 | 零 | 先前生成的身份应用程序证书文件的完整路径。 |
CertificatePassword |
必需 | 零 | 帮助保护证书私钥的密码。 |
Environment |
可选 | AzureCloud | 目标Azure Active Directory图形服务可用的受支持云环境的名称。 允许的值:'AzureChinaCloud'。 |
创建 ADFS 应用
- 以 azurestack\AzureStackAdmin 身份打开 PowerShell 实例。
- 转到在先决条件步骤中下载并提取的脚本所在的位置。
- 安装适用于 Azure Stack Hub 的 PowerShell。
- 运行 Create-ADFSIdentityApp.ps1 脚本。
- 在“凭据”窗口中,输入 AD FS 云管理帐户和密码。 选择“确定”。
- 为 之前创建的证书提供证书文件路径和证书密码。 默认情况下,为此步骤创建的证书是 sso.appservice.local.azurestack.external.pfx。
Create-ADFSIdentityApp.ps1
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
AdminArmEndpoint |
必需 | 零 | Azure 资源管理器管理终结点。 示例为 adminmanagement.local.azurestack.external。 |
PrivilegedEndpoint |
必需 | 零 | 特权终结点。 示例为 AzS-ERCS01。 |
CloudAdminCredential |
必需 | 零 | Azure Stack Hub 云管理员的域帐户凭据。 示例为 Azurestack\CloudAdmin。 |
CertificateFilePath |
必需 | 零 | 标识应用程序的证书 PFX 文件的完整路径。 |
CertificatePassword |
必需 | 零 | 帮助保护证书私钥的密码。 |
从 Azure 市场下载项
Azure Stack Hub 上的 Azure 应用服务 需要你先从 Azure 市场 下载项目,才能使这些项目在 Azure Stack Hub Marketplace 中可用。 在开始部署或升级Azure Stack Hub Azure 应用服务之前,请下载以下项:
重要
Windows Server Core 不是可用于 Azure Stack Hub 上的 Azure 应用服务 的受支持平台映像。
请勿将评估映像用于生产部署。
- Windows Server 2022 Datacenter VM 映像的最新版本。
已启用 Microsoft .NET 3.5.1 SP1 的 Windows Server 2022 Datacenter 完整 VM 映像。 基于 Azure Stack Hub 的 Azure 应用服务要求在用于部署的映像上激活 Microsoft.NET 3.5.1 SP1。 通过 Azure 市场分发的 Windows Server 2022 映像未启用此功能。 在未联网环境中,映像无法连接到 Microsoft Update 来下载要使用 DISM 安装的软件包。 因此,对于断开连接部署,你必须创建并使用其中已预先启用此功能的 Windows Server 2022 映像。
有关创建自定义映像并将其添加到市场的信息,请参阅 将自定义 VM 映像添加到 Azure Stack Hub。 将映像添加到市场时,请务必指定以下属性:
- 发布者 = MicrosoftWindowsServer
- 产品/服务 = WindowsServer
- SKU = AppService
- 版本 = 指定“最新”版本
- 自定义脚本扩展 v1.9.1 或更高版本。 此项为 VM 扩展。