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

排查 Azure 应用程序网关会话相关性问题

了解如何诊断和解决 Azure 应用程序网关的会话相关性问题。

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

概述

若要在同一服务器上保留用户会话,可使用基于 Cookie 的会话亲和性功能。 借助网关托管的 Cookie,应用程序网关可以将来自用户会话的后续流量定向到同一服务器进行处理。 在用户会话的会话状态在服务器上进行本地保存的情况下,此功能十分重要。 会话亲和性也称为“粘滞会话”。

注意

应用程序网关 v1 发出名为 ARRAffinity 的 Cookie,用于将流量定向到相同的后端池成员。 在应用程序网关 v2 中,此 Cookie 已重命名为 ApplicationGatewayAffinity。 出于本文档的目的,ApplicationGatewayAffinity 将用作示例,可在适合应用程序网关 v1 实例的情况下替代 ARRAffinity。

问题的可能原因

基于 Cookie 的会话相关性问题的主要可能原因如下:

  • 未启用“基于 Cookie 的相关性”设置
  • 应用程序无法处理基于 Cookie 的相关性
  • 应用程序使用基于 Cookie 的相关性,但请求仍在后端服务器之间弹跳

如果你忘记了启用“基于 Cookie 的相关性”设置,则有时会出现会话相关性问题。 若要确定是否在 Azure 门户中的“HTTP 设置”选项卡上启用了“基于 Cookie 的相关性”设置,请遵照以下说明操作:

  1. 登录到 Azure 门户

  2. 左侧导航窗格中,单击“所有资源”。 在“所有资源”边栏选项卡中单击应用程序网关名称。 如果所选订阅中已包含多个资源,则可在“按名称筛选…”框中输入应用程序网关名称,来轻松访问应用程序网关。

  3. 选择“设置”下的“HTTP 设置”选项卡。

    屏幕截图显示“设置”中已选中 HTTP 设置。

  4. 选择 HTTP 设置,在“添加 HTTP 设置”页上,检查是否启用了“基于 Cookie 的相关性”。

    屏幕截图显示了应用网关的网关设置,其中包括是否选择了基于 Cookie 的相关性。

也可以使用以下方法之一,检查“backendHttpSettingsCollection”下的“CookieBasedAffinity”值是否设置为“Enabled”:

"cookieBasedAffinity": "Enabled", 

原因

应用程序网关只能使用 Cookie 执行基于会话的相关性。

解决方法

如果应用程序无法处理基于 Cookie 的相关性,则必须使用外部或内部 Azure 负载均衡器或其他第三方解决方案。

症状

你已启用“基于 Cookie 的相关性”设置,但在 Internet Explorer 中使用短名 URL(例如 http://website)访问应用程序网关时,请求仍在后端服务器之间弹跳。

若要识别此问题,请遵照以下说明操作:

  1. 在连接到应用程序网关后面的应用程序的“客户端”上提取 Web 调试器跟踪(本示例使用 Fiddler)。 提示如果你不知道如何使用 Fiddler,请选中底部的“我想要收集网络流量并使用 Web 调试器分析它”选项。

  2. 检查并分析会话日志,确定客户端提供的 Cookie 是否包含 ApplicationGatewayAffinity 详细信息。 如果在 Cookie 集中找不到类似于“ApplicationGatewayAffinity=ApplicationGatewayAffinityValue”的 ApplicationGatewayAffinity 详细信息,则表示客户端未使用应用程序网关提供的 ApplicationGatewayAffinity Cookie 做出回复。 例如:

    屏幕截图显示了一个会话日志,其中突出显示了一个条目。

    屏幕截图显示了 HTTP 的请求头,其中包括 cookie 信息。

应用程序会持续尝试针对每个请求设置 Cookie,直到收到回复。

原因

此问题的可能原因是 Internet Explorer 和其他浏览器无法存储或使用包含短名 URL 的 Cookie。

解决方法

若要解决此问题,应使用 FQDN 访问应用程序网关。 例如,使用 http://website.comhttp://appgw.website.com

用于故障排除的其他日志

可以收集其他日志并对其进行分析,以排查基于 Cookie 的会话相关性的相关问题

分析应用程序网关日志

若要收集应用程序网关日志,请遵照以下说明操作:

使用 Azure 门户启用日志记录。

  1. Azure 门户中找到资源,然后选择“诊断设置”。

    对于应用程序网关,有三个日志可用:访问日志、性能日志和防火墙日志。

  2. 若要开始收集数据,请选择“添加诊断设置”。

    屏幕截图显示了已选择“诊断设置”的应用程序网关。

  3. “诊断设置”页提供了用于诊断日志的设置。 本示例使用 Log Analytics 存储日志。 也可使用事件中心和存储帐户保存诊断日志。

    屏幕截图显示了“诊断设置”窗格,其中已选择“Log Analytics 配置”。

  4. 确认设置,然后选择“保存”。

使用 Web 调试器捕获和分析 HTTP 或 HTTPS 流量

Fiddler 之类的 Web 调试工具可以捕获 Internet 与测试计算机之间的网络流量,并以此帮助你调试 Web 应用程序。 当浏览器接收/发送传入和传出数据时,可以使用此类工具来检测这些数据。 在此示例中,Fiddler 提供 HTTP 重放选项来帮助你排查 Web 应用程序的客户端问题,尤其是身份验证类型相关的问题。

使用所选的 Web 调试器。 此示例将使用 Fiddler 来捕获和分析 http 或 https 流量,具体说明如下:

  1. 下载 Fiddler

    注意

    如果捕获流量的计算机上已安装 .NET 4,请选择 Fiddler4。 否则请选择 Fiddler2。

  2. 右键单击安装程序可执行文件,并以管理员的身份安装该程序。

    屏幕截图显示了带有上下文菜单的 Fiddler 设置程序,其中已选择“以管理员身份运行”。

  3. 打开 Fiddler 时,它应会自动开始捕获流量(注意左下角的“正在捕获”)。 按 F12 键可以启动或停止流量捕获。

    屏幕截图显示了 Fiddler Web 调试器,其中突出显示了“正在捕获”指示器。

  4. 你很有可能对已解密的 HTTPS 流量感兴趣;选择“工具”>“Fiddler 选项”,然后选中“解密HTTPS 流量”框,即可启用 HTTPS 解密。

    屏幕截图显示了 Fiddler 中的选项,其中已选择 HTTP 和“解密 HTTPS 流量”。

  5. 在再现问题之前,可以通过单击“X”(图标)>“全部删除”来删除以前的不相关会话,如以下屏幕截图所示:

    屏幕截图显示已选择 X 图标,其中显示了“全部删除”选项。

  6. 再现问题后,选择“文件”>“保存”>“所有会话...”以保存该文件供复查。

    屏幕截图显示已选择“文件”>“保存”>“所有会话”选项。

  7. 检查并分析会话日志以确定问题所在。

    例如:

  • 示例 A: 在会话日志中,你发现请求是从客户端发出的,该请求发送到了应用程序网关的公共 IP 地址。于是你单击此日志以查看详细信息。 右侧下框中的数据是应用程序网关返回给客户端的数据。 选择 RAW 选项卡并确定客户端是否接收到“Set-Cookie: ApplicationGatewayAffinity=ApplicationGatewayAffinityValue”。如果没有 Cookie,则未设置会话相关性,或者应用程序网关未将 Cookie 应用回客户端。

    注意

    此 ApplicationGatewayAffinity 值是应用程序网关为客户端设置的 Cookie ID,它将发送到特定的后端服务器。

    屏幕截图显示了一个日志条目的详细信息示例,其中突出显示了 Set-Cookie 值。

  • 示例 B:前一条会话日志后面的会话日志是客户端返回给应用程序网关的响应,其中设置了 ApplicationGatewayAffinity。 如果 ApplicationGatewayAffinity Cookie ID 匹配,则数据包应会发送到前面使用的同一个后端服务器。 检查 http 通信的后面几行,以查看客户端的 ApplicationGatewayAffinity Cookie 是否在发生变化。

    屏幕截图显示了一个日志条目的详细信息示例,其中突出显示了 cookie。

注意

对于同一个通信会话,Cookie 不应该变化。 检查右侧的上框,选择“Cookie”选项卡以查看客户端是否正在使用 Cookie 并将其发回到应用程序网关。 如果不是,则表示客户端浏览器未保留 Cookie 并将其用于对话。 有时,客户端可能提供不实的数据。

后续步骤

如果上述步骤无法解决问题,请开具支持票证