多个亲和性 cookie
Multiple affinity cookies
我有多个具有以下特征的 azure 网站
- 每个网站 运行 在其自己的网络服务器上(app-service 计划)
- 它们是运行多个实例
- 他们在共享域下有自己的子域
- 他们(有意)启用了 ARR
其中一个站点是主站点,并使用不带子域的域作为其主机名。这是我问题的根本原因。
分别访问 sub.domain.com
和 domain.com
(两个不同的网站,在不同的 app-service 计划中)将为每个网站设置亲和力 cookie。
cookie 规范指出,cookie 应包含在对 cookie 域 属性 的任何子域的请求中。这意味着,如果我现在访问 sub.domain.com
,浏览器将包含两个关联 cookie,因为它在技术上是 domain.com
.
的子域
Azure 的负载均衡器显然只查看第一个包含的关联 cookie。如果这恰好是属于 domain.com
的那个,它将包含一个无效值,并且负载均衡器轮循请求到一个随机的免费实例。响应将包含一个 set-cookie header 和一个有效的关联 cookie,但无论如何这将作为第二个 cookie 包含在后续请求中,问题仍然存在。这有效地完全禁用了所有子域的 ARR,只要 domain.com
affinity cookie 存在,以及我们网站所依赖的粘性会话。
目前,我在 domain.com
网站上禁用了 ARR,因为它在一个实例中只有 运行s。但这是可能的,因为我们处于试生产阶段。在不久的将来的某个时候,我将需要至少扩展到两个实例,因为 azure SLA 需要这样才能生效。
问题可以通过将 domain.com
上的站点迁移到子域 (f.ex.: www.domain.com
) 来解决,但我真的不想这样做。
理想情况下,我希望负载均衡器检查所有包含的亲和性 cookie,而不仅仅是第一个。但在解决这个问题之前,我很想知道任何解决方法。据我所知,我可以控制的 ARR 的唯一方面是是否应该启用它。
Azure 支持团队对此问题的回复如下:
I wanted to let you know the status of the issue. The product team has analyzed the issue and they will look into it. They have agreed that the best solution is for ARR to iterates thru all cookies.
Unfortunately right now we don’t have any ETA so for now the best workaround, as you said, is adding the www to your naked domain.
老实说,我认为这是最好的结果。 Azure 已识别出该问题,并致力于纠正它。在那之前,如果您需要粘性会话,可能的解决方法是
- 不要在未共享应用服务计划的网站上同时使用裸域和子域
- 跨网站实例使用共享会话,从而完全消除对 ARR 的需求。在 ASP.NET 中,很容易设置不同的会话状态提供程序,使用 SQL、Redis、Azure 存储或其他东西作为会话存储。
我有多个具有以下特征的 azure 网站
- 每个网站 运行 在其自己的网络服务器上(app-service 计划)
- 它们是运行多个实例
- 他们在共享域下有自己的子域
- 他们(有意)启用了 ARR
其中一个站点是主站点,并使用不带子域的域作为其主机名。这是我问题的根本原因。
分别访问 sub.domain.com
和 domain.com
(两个不同的网站,在不同的 app-service 计划中)将为每个网站设置亲和力 cookie。
cookie 规范指出,cookie 应包含在对 cookie 域 属性 的任何子域的请求中。这意味着,如果我现在访问 sub.domain.com
,浏览器将包含两个关联 cookie,因为它在技术上是 domain.com
.
Azure 的负载均衡器显然只查看第一个包含的关联 cookie。如果这恰好是属于 domain.com
的那个,它将包含一个无效值,并且负载均衡器轮循请求到一个随机的免费实例。响应将包含一个 set-cookie header 和一个有效的关联 cookie,但无论如何这将作为第二个 cookie 包含在后续请求中,问题仍然存在。这有效地完全禁用了所有子域的 ARR,只要 domain.com
affinity cookie 存在,以及我们网站所依赖的粘性会话。
目前,我在 domain.com
网站上禁用了 ARR,因为它在一个实例中只有 运行s。但这是可能的,因为我们处于试生产阶段。在不久的将来的某个时候,我将需要至少扩展到两个实例,因为 azure SLA 需要这样才能生效。
问题可以通过将 domain.com
上的站点迁移到子域 (f.ex.: www.domain.com
) 来解决,但我真的不想这样做。
理想情况下,我希望负载均衡器检查所有包含的亲和性 cookie,而不仅仅是第一个。但在解决这个问题之前,我很想知道任何解决方法。据我所知,我可以控制的 ARR 的唯一方面是是否应该启用它。
Azure 支持团队对此问题的回复如下:
I wanted to let you know the status of the issue. The product team has analyzed the issue and they will look into it. They have agreed that the best solution is for ARR to iterates thru all cookies.
Unfortunately right now we don’t have any ETA so for now the best workaround, as you said, is adding the www to your naked domain.
老实说,我认为这是最好的结果。 Azure 已识别出该问题,并致力于纠正它。在那之前,如果您需要粘性会话,可能的解决方法是
- 不要在未共享应用服务计划的网站上同时使用裸域和子域
- 跨网站实例使用共享会话,从而完全消除对 ARR 的需求。在 ASP.NET 中,很容易设置不同的会话状态提供程序,使用 SQL、Redis、Azure 存储或其他东西作为会话存储。