tencent cloud

边缘安全加速平台 EO

动态与公告
产品动态
安全公告
产品公告
产品简介
产品概述
产品优势
应用场景
EdgeOne 与 CDN 等产品功能对比
使用限制
购买指南
试用套餐体验权益说明
免费版套餐使用说明
计费概述
计费项目
购买指引
续费指引
欠费与退款说明
套餐选型对比
关于“干净流量”计费说明
DDoS 防护容量说明
快速入门
选择业务场景
快速接入网站安全加速
通过 Pages 快速部署网站
域名服务与源站配置
域名服务
HTTPS 证书
源站配置
站点加速
概述
访问控制
智能加速
缓存配置
文件优化
网络优化
URL 重写
修改头部
修改应答内容
规则引擎
图片与视频处理
单连接下载限速
DDoS 与 Web 防护
概述
DDoS 防护
Web 防护
Bot 管理
API 资产识别(Beta)
边缘函数
概述
快速指引
操作指引
Runtime APIs
示例函数
实践教程
Pages
四层代理
概述
新建四层代理实例
修改四层代理实例配置
停用/删除四层代理实例
批量配置转发规则
获取客户端真实IP
数据分析与日志服务
日志服务
数据分析
告警服务
站点与计费管理
计费管理
站点管理
版本管理
通用策略
通用参考
配置语法
请求与响应行为
国家/地区及对应代码枚举
Terraform
Terraform 简介
安装和配置 Terraform
实践教程
自动预热/清除缓存
防盗刷/盗链实践
HTTPS 相关实践
加速优化
流量调度
数据分析与告警
第三方日志平台集成实践
对象存储类源站(例如:COS)配置实践
跨域响应配置
API 文档
History
Introduction
API Category
Making API Requests
Site APIs
Acceleration Domain Management APIs
Site Acceleration Configuration APIs
Edge Function APIs
Alias Domain APIs
Security Configuration APIs
Layer 4 Application Proxy APIs
Content Management APIs
Data Analysis APIs
Log Service APIs
Billing APIs
Certificate APIs
Origin Protection APIs
Load Balancing APIs
Diagnostic Tool APIs
Custom Response Page APIs
API Security APIs
DNS Record APIs
Content Identifier APIs
Legacy APIs
Ownership APIs
Image and Video Processing APIs
Multi-Channel Security Gateway APIs
Version Management APIs
Data Types
Error Codes
常见问题
产品特性相关问题
DNS 记录相关问题
域名配置相关问题
站点加速相关问题
数据与日志相关问题
安全防护相关问题
源站配置相关问题
排障指南
异常状态码参考
EdgeOne 4XX/5XX 状态码排障指南
520/524状态码排障指南
521/522 状态码排障指南
工具指南
相关协议
Service Level Agreement
源站防护启用特别约定
TEO 政策
隐私协议
数据处理和安全协议
联系我们
词汇表

EdgeOne 实现基于客户端 IP 地址的会话保持

PDF
聚焦模式
字号
最后更新时间: 2025-07-29 17:24:11
本篇文档学习预计需要10分钟,通过学习该文档,您可以了解到:
1. 什么是基于客户端 IP 地址进行会话保持?为什么需要?
2. 基于客户端 IP 地址的会话保持的适用场景。
3. 基于客户端 IP 地址的技术架构及原理说明。
4. EdgeOne 边缘函数加规则引擎实现基于客户端 IP 地址的会话保持的具体步骤。

背景介绍

随着互联网的快速发展,企业业务不断扩展并深化用户体验,单一的源站服务器逐渐无法满足处理大量并发请求的需求,为了提升服务的可用性和可扩展性,企业开始采用负载均衡技术,将用户请求分发到多个后端源站上进行处理。然而,在业务发展的初期,由于用户量相对较少,会话管理相对简单,通常不会遇到基于客户端 IP 地址的会话保持问题,但随着业务的进一步发展,特别是在以下场景中,基于客户端 IP 地址的会话保持需求变得尤为迫切:
用户登录状态保持:在一些需要用户登录的应用中,如电子商务网站、在线银行等,用户登录后会在源站上生成一个会话(Session),用于记录用户的登录状态、购物车信息、订单详情等。如果用户在浏览过程中被分配到不同的后端源站,可能会因为会话信息的丢失而需要重新登录,严重影响用户体验。
数据一致性要求高的业务:在一些对数据一致性要求极高的业务中,如金融交易、在线支付等,如果会话被分配到不同的源站,可能会导致数据不一致或丢失,给用户和企业带来严重的损失。
EdgeOne 在上述背景下推出基于客户端 IP 地址的会话保持,即通过 EdgeOne 的边缘函数加规则引擎实现来自同一客户端 IP 地址的请求始终被转发到同一台后端源站上,从而保持会话的连续性和数据的一致性。

适用场景

通过识别客户端的 IP 地址来确保同一个客户端的请求被定向到同一个源站,适用于以下业务场景:
金融服务:在线银行、股票交易等应用需要确保用户在整个交易过程中的所有请求都通过同一源站处理,以维护交易的安全性和一致性。
电子商务网站:确保用户登录后,其所有请求都被路由到同一源站,以保持购物车信息、用户偏好设置和登录状态。

技术架构


基于客户端 IP 地址的会话保持具体原理为边缘函数根据客户端的 IP 地址(如上图的 IP:192.168.1.108),通过哈希算法将客户端映射到不同的源站,规则引擎获取在边缘函数中自定义的回源请求头,根据请求头的值实现同一个客户端总是回源到同一个源站,以此来实现客户端到特定源站的一致性。此方案不仅可以提升用户体验,还可以确保业务数据的准确性。

预设场景

假设您是一家全球性应用服务的技术负责人,已将您的站点域名 example.com 接入到 EdgeOne。您期望根据用户的 IP 地址的哈希值始终将请求路由到对应的源站,确保用户无论身处何地,同一用户的请求始终被路由到同一源站,有助于优化缓存效率、简化会话管理、实现负载均衡和提供个性化服务,并确保数据处理的合法合规。
在这个场景中,您面对的是数百万不同的用户,这些用户的请求需要被均匀地分配到中国大陆的源站新加坡的源站,同时您期望同一个 IP 地址的请求始终被路由到同一源站,以实现一致性的用户体验和高效的资源利用。在该示例中,将需要转发到中国大陆的源站的 IP 通过边缘函数增加一个回源请求头为:X-Forwarded-For-Origin:originGroup1,将需要转发到新加坡的源站的 IP 通过边缘函数增加一个回源请求头为:X-Forwarded-For-Origin:originGroup2

操作步骤

步骤1:接入 EdgeOne

参照 从零快速开始接入 EdgeOne,完成站点接入及域名接入。

步骤2:创建并配置边缘函数

1. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,进入服务总览,单击网站安全加速内需配置的站点。
2. 在左侧导航栏中,单击边缘函数 > 函数管理
3. 在函数管理页面,单击新建函数
4. 在选择模板创建页面,选择为创建 Hello World 后,单击下一步
5. 在新建函数页面,输入函数名称、函数描述和函数代码。以下为基于客户端 IP 地址的会话保持示例代码:
// 根据客户端ip地址,返回到不同的源站组,也就是在IP地址不变的情况下,同一个客户端回到同一个源站
const ORIGIN_GROUPS = ["originGroup1", "originGroup2"];

// 定义虚拟节点数,若源站组(ORIGIN_GROUPS)较多时,建议调低虚拟节点数
const VIRTUAL_NODES_PER_GROUP = 15;
const ORIGIN_HEADER_NAME = 'X-Forwarded-For-Origin';
let virtualNodesHashesCache = null;

// 定义全局变量来跟踪函数调用次数
addEventListener("fetch", (event) => {
handleRequest(event.request);
});

async function handleRequest(request) {
// 通过 EO-Client-IP 头部获取客户端 IP
const ip = request.headers.get("EO-Client-IP") || "";
// 如果缓存中没有虚拟节点哈希值,则生成虚拟节点哈希值
if (!virtualNodesHashesCache) {
virtualNodesHashesCache = await generateVirtualNodesHashes();
}
const group = await findSourceGroupForIp(
ip,
virtualNodesHashesCache.hashes,
virtualNodesHashesCache.mapping
);
console.log(`Group: ${group}`);
request.headers.set(ORIGIN_HEADER_NAME, group)

return;
}
// 生成虚拟节点的哈希值
async function generateVirtualNodesHashes() {
const virtualNodesHashes = {};
for (let group in ORIGIN_GROUPS) {
for (let i = 0; i < VIRTUAL_NODES_PER_GROUP; i++) {
const virtualNodeIdentifier = `${group}-VN${i}`;
const hash = await md5(virtualNodeIdentifier);
if (!virtualNodesHashes[hash]) {
virtualNodesHashes[hash] = group;
}
}
}

const hashes = Object.keys(virtualNodesHashes).sort();
return { hashes, mapping: virtualNodesHashes }; // 返回排序后的哈希值数组和映射
}

// 映射客户端IP到虚拟节点,并找到对应的源站组
async function findSourceGroupForIp(ip, hashes, mapping) {
// 使用md5函数计算IP的哈希值
const ipHash = await md5(ip);
let closestHash = hashes.find((hash) => hash > ipHash) || hashes[0];
// 根据找到的虚拟节点哈希值,从虚拟节点哈希表中获取对应的源站组名称
const selectedGroupName = mapping[closestHash];
const selectedGroupIPs = ORIGIN_GROUPS[selectedGroupName];
// 打印日志,显示客户端IP、哈希值、最接近的虚拟节点哈希值、选定的源站组名称
console.log(
`IP: ${ip}, Hash: ${ipHash}, Closest Hash: ${closestHash}, Selected Group: ${selectedGroupName}`
);
// 返回选定的源站组名称
return selectedGroupIPs;
}

function bufferToHex(arr) {
return Array.prototype.map
.call(arr, (x) => (x >= 16 ? x.toString(16) : "0" + x.toString(16)))
.join("");
}

async function md5(text) {
const buffer = await crypto.subtle.digest("MD5", TextEncoder().encode(text));
return bufferToHex(new Uint8Array(buffer));
}

步骤3:配置并部署边缘函数的触发规则

1. 编辑完成函数后,单击创建并部署,函数部署后,可直接单击新增触发规则,前往配置该函数的触发规则。



2. 在函数触发规则中,配置该函数的触发条件,根据当前的场景需求,您可以配置多条触发条件,以 And 逻辑触发。
此处仅配置该请求 HOST 等于 example.com
当请求 URL 同时符合以上条件时,将触发步骤1中的边缘函数,实现基于客户端 IP 地址的会话保持功能。

3. 单击确定触发规则即可生效。

步骤4:配置规则引擎

1. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,进入服务总览,单击网站安全加速内需配置的站点。
2. 在左侧导航栏中,单击站点加速,进入站点全局配置页面,单击规则引擎 Tab 页。
3. 在规则引擎页面,单击创建规则,选择新增空白规则
4. 在规则编辑页面,选择 HOST 匹配类型以匹配指定域名的请求。
此处仅配置该请求 HOST 等于 example.com
5. 在规则编辑页面,打开客户端 IP 头部,参照 获取客户端 IP
此处仅配置头部名称为EO-Client-IP
6. 在规则编辑页面,单击+IF,根据边缘函数的函数代码中的请求头取值,配置不同的源站组。
此处仅配置当满足条件为 HTTP 请求头 X-Forwarded-For-Origin 等于originGroup1时,请求将被转发至中国大陆的源站组进行处理;当满足条件为 HTTP 请求头 X-Forwarded-For-Origin 等于originGroup2时,请求将被转发至新加坡的源站组进行处理。

7. 单击保存并发布规则引擎即可生效。

步骤5:验证部署效果

经过测试,本示例展现出了良好的负载均衡能力,负载均衡占比在50%上下浮动,并且能够有效保持用户会话的一致性,证明了部署效果符合预期。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈