如何在 OpenResty Edge 中启用粘性 Cookie(会话保持)
Sticky Cookie 如何在 OpenResty Edge 中保持会话亲和
OpenResty Edge 中的 Sticky Cookie 会把每个客户端固定到同一台后端上游服务器,让一个会话中的所有请求都落到同一台主机上。OpenResty Edge 会下发一个粘性 Cookie,使得同一客户端的后续请求都返回到同一台服务器——从而实现会话亲和(会话保持),且无需改动任何 Nginx 配置,也无需重载网关。你只需在页面规则里打开一个开关即可启用,粒度可以是上游集群级别,也可以是单台服务器级别。本教程将演示如何启用 Sticky Cookie、验证请求确实固定在同一台后端,然后再禁用它、观察流量恢复轮询分发。
首先在启用 Sticky Cookie 的情况下发送两个请求,我们会看到它们被发送到了同一个后端服务器。
之后在禁用 Sticky Cookie 的情况下再发送两个请求,然后会观察到这次的两个请求被发送到了两个不同的后台服务器。
为上游启用 Sticky Cookie(服务器级别亲和)
让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们控制台的样本部署。每个用户都有自己的本地部署。
我们可以继续使用之前的示例应用,test-edge.com。
进入该应用程序。
转到 “Upstreams” 页面。
我们已经定义了一个上游。
这个上游目前有一个上游服务器。
我们需要两个上游服务器。现在再增加一个服务器。
点击 “Add a new upstream server” 按钮。
输入上游服务器的主机名。
检查一下上游服务器是否可用。
可以看到返回了开源 OpenResty 的默认主页,与预期结果相符。
保存上游。
转到 “Page Rules” 页面。
在之前的教程中我们已经设置了一个反向代理的页面规则。
编辑这个页面规则,启用 Sticky Cookie。
打开 Sticky Cookie 的开关。
由于我们的上游服务器是在一个上游集群里面,这里我们选择使用服务器级别的 Sticky Cookie。
选择服务器级别。
这里我们可以设置 Sticky Cookie 的过期时间。
使用默认值 0,代表永远不会过期。
保存这个页面规则。
接下来,我们将会创建一个动态指标来查看请求的分布。 注意对于 Sticky Cookie 的设置来说这一步并不是必须的。Sticky Cookie 功能不依赖任何动态指标。
单击 “New Metric” 按钮。
我们把这个动态指标命名为 “Upstream Server Request Count”。
添加一个描述。
设置上报间隔为 10 秒。
输入 Metric SQL 语句。它将选择上游服务器地址。
从所有的请求中。
并且按照上游服务器地址分组显示。
保存这个指标。
像往常一样,需要发布一个新的版本来推送我们刚才的改动。
点击这个按钮。
发布!
新版本现在已经同步到所有的网关服务器上了。
刚才的改动已经被推送到所有的网关集群和服务器。
这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。
测试 Sticky Cookie:所有请求命中同一台后端
现在让我们来发送两个请求。发送第一个请求。
发送第二个请求。
所有请求发送成功。
来看一下动态指标所记录的数据。
选择柱状图。
可以看到所有请求都被发送到同一个上游服务器上。
正如下方图片所显示的那样。
禁用 Sticky Cookie 并恢复轮询
接下来,我们将演示禁用 Sticky Cookie 的情况。
先清理一下指标数据。
这里需要点击确认。
清理工作已经完成,现在来禁用 Sticky Cookie。
再次编辑这个页面规则。
关闭 “Sticky Cookie” 开关。
注意,均衡策略是 “Round Robin”。
保存页面规则。
像往常一样,需要发布一个新的版本来推送我们刚才的改动。
点击这个按钮。
发布!
新版本现在已经同步到所有的网关服务器上了。
再次测试:请求分散到多台后端
接下来,再次发送两个请求。
发送第一个请求。
发送第二个请求。
所有请求发送完成。
重新检查动态指标。
点击柱状图。
可以看到这两个请求分别访问了不同的上游服务器。
正如下方图片显示的那样。
通过 Sticky Cookie,OpenResty Edge 让客户端与某个上游集群或单台上游服务器保持亲和——实现会话保持,且无需任何 Nginx 配置或重载。Sticky Cookie 只在单个上游内固定流量;若要在多个地区或数据中心之间调度用户流量,请参阅全局服务器负载均衡的工作原理;对于非 HTTP 服务,请参阅 OpenResty Edge 中的 TCP 负载均衡。
常见问题
粘性会话(sticky session)和会话亲和(session affinity)有什么区别?
它们描述的是同一种行为:在一个会话期间把客户端固定到同一台后端。“会话亲和”(也称会话保持)是目标,而粘性 Cookie 是实现这一目标的机制。在本演示中,OpenResty Edge 会下发一个粘性 Cookie,使同一客户端的每个请求都回到同一台上游服务器。
什么时候应该使用 Sticky Cookie?
当来自同一客户端的请求需要持续命中同一台后端服务器时,就应该使用 Sticky Cookie。本演示直观地展示了效果:启用 Sticky Cookie 时,两个请求落在同一台上游服务器上;禁用后,同样的两个请求会被轮询分发到不同的服务器。
服务器级别和集群级别的 Sticky Cookie 有什么区别?
服务器级别的 Sticky Cookie 将客户端固定到单台上游服务器,而集群级别的 Sticky Cookie 将客户端固定到一个上游集群。本教程中的上游服务器都位于同一个上游集群内,因此我们选择服务器级别,让每个客户端保持在同一台服务器上。
Sticky Cookie 的过期时间为 0 是什么意思?
过期时间控制粘性 Cookie 的有效时长。默认值 0 表示 Cookie 永不过期,因此客户端会一直固定在同一台后端服务器上。如果希望亲和关系在一段时间后重置,请设置一个非零值。
关于 OpenResty Edge
OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!





















































































