Azure Stack Hub 上的应用服务 Update 8 发行说明

这些发行说明介绍 Azure Stack Hub 上的 Azure 应用服务 Update 8 中的新功能、修复和已知问题。 已知问题分为两部分:与升级过程相关的问题,以及内部版本(安装后)的问题。

重要

请将 1910 更新应用于 Azure Stack 集成系统,或部署最新的 Azure Stack 开发工具包 (ASDK),然后部署 Azure 应用服务 1.8。

内部版本参考

Azure Stack Hub 上的应用服务 Update 8 的内部版本号为 86.0.2.13

先决条件

在开始部署之前,请参阅在 Azure Stack Hub 上部署应用服务的先决条件

开始将 Azure Stack Hub 上的 Azure 应用服务升级到 1.8 之前:

  • 请确保所有角色在 Azure Stack Hub 管理员门户的 Azure 应用服务管理中处于“就绪”状态。

  • 在 Azure Stack Hub 管理员门户中使用应用服务管理来备份应用服务机密

  • 备份应用服务和 master 数据库:

    • AppService_Hosting;
    • AppService_Metering;
  • 备份租户应用内容文件共享。

    重要

    云操作员负责文件服务器和 SQL Server 的维护和操作。 资源提供程序不管理这些资源。 云操作员负责备份应用服务数据库和租户内容文件共享。

  • 同步发布 Azure Stack Hub 市场的自定义脚本扩展版本 1.9.3

新功能和修复

Azure Stack Hub 上的 Azure 应用服务 Update 8 包含以下改进和修复:

  • 针对应用服务租户、管理员、函数门户和 Kudu 工具的更新。 与 Azure Stack 门户 SDK 版本一致。

  • 将 Azure Functions 运行时更新到 v1.0.12615

  • 针对核心服务的更新,用于提高可靠性和错误消息传递,以便更轻松地诊断常见问题。

  • 针对以下应用框架和工具的更新

    • ASP.NET Core 3.1.0
    • ASP.NET Core 3.0.1
    • ASP.NET Core 2.2.8
    • ASP.NET Core 模块 v2 13.1.19331.0
    • Azul OpenJDK 8.38.0.13
    • Tomcat 7.0.94
    • Tomcat 8.5.42
    • Tomcat 9.0.21
    • PHP 7.1.32
    • PHP 7.2.22
    • PHP 7.3.9
    • 已将 Kudu 更新到 85.11024.4154
    • MSDeploy 3.5.80916.15
    • NodeJS 10.16.3
    • NPM 6.9.0
    • Git for Windows 2.19.1.0
  • 对所有角色的基础操作系统的更新

  • 新部署对托管磁盘的支持

Azure Stack Hub 上的 Azure 应用服务的所有新部署将对所有虚拟机和虚拟机规模集都使用托管磁盘。 所有现有部署将继续使用非托管磁盘。

  • 前端负载均衡器实施的 TLS 1.2

现已对所有应用强制实施 TLS 1.2。

已知问题(升级)

  • 如果 SQL Server Always On 群集已故障转移到辅助节点,升级将会失败。

在升级期间,使用主连接字符串检查数据库存在性的调用将会失败,因为登录名位于前一个控制平面节点上。

请执行以下操作之一,然后在安装程序中选择“重试”。

  • 从当前的辅助 SQL 节点复制 appservice_hostingAdmin 登录名;

    或者

  • 将 SQL 群集故障转移到前一个活动节点。

部署后步骤

重要

如果已经为应用服务资源提供程序提供 SQL Always On 实例,则必须将 appservice_hosting 和 appservice_metering 数据库添加到可用性组并同步数据库,以免在进行数据库故障转移时丢失服务。

已知问题(安装后)

  • 如 Azure Stack Hub 上的 Azure 应用服务部署文档中所述,当应用服务部署在现有虚拟网络中并且文件服务器仅在专用网络上可用时,工作人员将无法访问文件服务器。

    如果选择部署到现有虚拟网络和内部 IP 地址以连接到文件服务器,则必须添加出站安全规则,以便在工作子网和文件服务器之间启用 SMB 流量。 转到管理员门户中的 WorkersNsg 并添加包含以下属性的出站安全规则:

    • 源:任意
    • 源端口范围:*
    • 目标:IP 地址
    • 目标 IP 地址范围:文件服务器的 IP 范围
    • 目标端口范围:445
    • 协议:TCP
    • 操作:允许
    • 优先级:700
    • 姓名:Outbound_Allow_SMB445
  • Azure Stack Hub 1.8 上新的 Azure 应用服务部署要求将数据库转换为包含的数据库。

    由于此版本中的功能回退,必须将新部署的两个应用服务数据库(appservice_hosting 和 appservice_metering)转换为包含的数据库。 这不会影响已升级的部署。

    重要

    此过程大约需要花费 5-10 分钟。 此过程涉及终止现有的数据库登录会话。 计划停机时间来进行迁移,并在迁移后验证 Azure Stack Hub 上的 Azure 应用服务。

    1. 将 AppService 数据库(appservice_hosting 和 appservice_metering)添加到可用性组

    2. 启用包含的数据库。

      
      sp_configure 'contained database authentication', 1;
      GO
      RECONFIGURE;
          GO
      
    3. 将数据库转换为“部分包含”。 此步骤会导致停机,因为需要终止所有活动会话。

      /******** [appservice_metering] Migration Start********/
          USE [master];
      
          -- kill all active sessions
          DECLARE @kill varchar(8000) = '';  
          SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'  
          FROM sys.dm_exec_sessions
          WHERE database_id  = db_id('appservice_metering')
      
          EXEC(@kill);
      
          USE [master]  
          GO  
          ALTER DATABASE [appservice_metering] SET CONTAINMENT = PARTIAL  
          GO  
      
      /********[appservice_metering] Migration End********/
      
      /********[appservice_hosting] Migration Start********/
      
          -- kill all active sessions
          USE [master];
      
          DECLARE @kill varchar(8000) = '';  
          SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'  
          FROM sys.dm_exec_sessions
          WHERE database_id  = db_id('appservice_hosting')
      
          EXEC(@kill);
      
          -- Convert database to contained
          USE [master]  
          GO  
          ALTER DATABASE [appservice_hosting] SET CONTAINMENT = PARTIAL  
          GO  
      
          /********[appservice_hosting] Migration End********/
      
    4. 将登录名迁移到包含的数据库用户。

      USE appservice_hosting
      IF EXISTS(SELECT * FROM sys.databases WHERE Name=DB_NAME() AND containment = 1)
      BEGIN
      DECLARE @username sysname ;  
      DECLARE user_cursor CURSOR  
      FOR
          SELECT dp.name
          FROM sys.database_principals AS dp  
          JOIN sys.server_principals AS sp
              ON dp.sid = sp.sid  
              WHERE dp.authentication_type = 1 AND dp.name NOT IN ('dbo','sys','guest','INFORMATION_SCHEMA');
          OPEN user_cursor  
          FETCH NEXT FROM user_cursor INTO @username  
              WHILE @@FETCH_STATUS = 0  
              BEGIN  
                  EXECUTE sp_migrate_user_to_contained
                  @username = @username,  
                  @rename = N'copy_login_name',  
                  @disablelogin = N'do_not_disable_login';  
              FETCH NEXT FROM user_cursor INTO @username  
          END  
          CLOSE user_cursor ;  
          DEALLOCATE user_cursor ;
          END
      GO
      
      USE appservice_metering
      IF EXISTS(SELECT * FROM sys.databases WHERE Name=DB_NAME() AND containment = 1)
      BEGIN
      DECLARE @username sysname ;  
      DECLARE user_cursor CURSOR  
      FOR
          SELECT dp.name
          FROM sys.database_principals AS dp  
          JOIN sys.server_principals AS sp
              ON dp.sid = sp.sid  
              WHERE dp.authentication_type = 1 AND dp.name NOT IN ('dbo','sys','guest','INFORMATION_SCHEMA');
          OPEN user_cursor  
          FETCH NEXT FROM user_cursor INTO @username  
              WHILE @@FETCH_STATUS = 0  
              BEGIN  
                  EXECUTE sp_migrate_user_to_contained
                  @username = @username,  
                  @rename = N'copy_login_name',  
                  @disablelogin = N'do_not_disable_login';  
              FETCH NEXT FROM user_cursor INTO @username  
          END  
          CLOSE user_cursor ;  
          DEALLOCATE user_cursor ;
          END
      GO
      

    验证

    1. 检查 SQL Server 是否启用了包含。

      sp_configure  @configname='contained database authentication'
      
    2. 检查现有的包含的行为。

      SELECT containment FROM sys.databases WHERE NAME LIKE (SELECT DB_NAME())
      
  • 无法横向扩展辅助角色

    新辅助角色无法获取所需的数据库连接字符串。 若要纠正这种情况,请连接到某个控制器实例(例如 CN0-VM),并运行以下 PowerShell 脚本:

    
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Hosting")
    $siteManager = New-Object Microsoft.Web.Hosting.SiteManager
    
    $builder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder -ArgumentList (Get-AppServiceConnectionString -Type Hosting)
    $conn = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $builder.ToString()
    
    $siteManager.RoleServers | Where-Object {$_.IsWorker} | ForEach-Object {
        $worker = $_
        $dbUserName = "WebWorker_" + $worker.Name
    
        if (!$siteManager.ConnectionContexts[$dbUserName]) {
            $dbUserPassword = [Microsoft.Web.Hosting.Common.Security.PasswordHelper]::GenerateDatabasePassword()
    
            $conn.Open()
            $command = $conn.CreateCommand()
            $command.CommandText = "CREATE USER [$dbUserName] WITH PASSWORD = '$dbUserPassword'"
            $command.ExecuteNonQuery()
            $conn.Close()
    
            $conn.Open()
            $command = $conn.CreateCommand()
            $command.CommandText = "ALTER ROLE [WebWorkerRole] ADD MEMBER [$dbUserName]"
            $command.ExecuteNonQuery()
            $conn.Close()
    
            $builder.Password = $dbUserPassword
            $builder["User ID"] = $dbUserName
    
            $siteManager.ConnectionContexts.Add($dbUserName, $builder.ToString())
        }
    }
    
    $siteManager.CommitChanges()
    
    

云管理员在操作基于 Azure Stack Hub 的 Azure 应用服务时的已知问题

请参阅 Azure Stack Hub 1907 发行说明中的文档。

  • 租户无法使用租户门户中的“应用服务计划”视图上的“新建”创建应用服务计划

创建新应用程序时,租户可以在“创建应用”工作流中创建应用服务计划,或者在更改当前应用的应用服务计划时创建应用服务计划,也可通过应用服务计划市场项创建应用服务计划

  • 自定义域在离线环境中不受支持

应用服务针对公共 DNS 终结点执行域所有权验证,因此,在离线场景下不支持自定义域。

  • 在某些情况下,辅助角色无法满足运行状况检查(磁盘空间不足)

在某些情况下,将大量站点分配给辅助角色时,或者站点正在处理大量请求时,辅助角色会在 C:\DWAS\LogFiles 中生成大量运行时日志文件。 这是因为这些日志文件的清理逻辑中存在 bug。

若要缓解此问题,请远程访问单个辅助角色并清除文件夹的内容。

此问题已在 Azure Stack Hub 2020 年第 3 季度的应用服务中修复。我们建议客户尽快升级到 2020 年第 3 季度版本。

重要

若要更新到 Azure Stack Hub 2020 第 3 季度的 Azure 应用服务,必须升级到 Azure Stack Hub 2008

后续步骤