You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Cloudflare使用NPM sticky-session?问题及解决方案咨询

结合Cloudflare使用sticky-session的解决方案

一、修复基于真实用户IP的会话粘性

sticky-session默认依赖connection.remoteAddress获取IP,但Cloudflare代理后这个值是CF节点的IP,而非用户真实IP,导致粘性失效。你可以通过Cloudflare提供的请求头拿到用户真实IP,以此作为哈希依据:

  • Cloudflare会在请求中添加CF-Connecting-IP头,该字段存储用户真实IP
  • 修改sticky-session的哈希逻辑,替换默认的IP来源

HTTP场景示例代码

const http = require('http');
const sticky = require('sticky-session');

const server = http.createServer((req, res) => {
  // 优先取Cloudflare传递的真实IP,降级取默认IP
  const realIp = req.headers['cf-connecting-ip'] || req.connection.remoteAddress;
  res.end(`Worker ${process.pid} handled request from ${realIp}`);
});

// 启动时指定自定义哈希函数
sticky.listen(server, 3000, {
  hash: (req) => {
    return req.headers['cf-connecting-ip'] || req.connection.remoteAddress;
  }
});

HTTPS场景示例代码

只需替换http模块为https并传入证书配置,核心哈希逻辑不变:

const https = require('https');
const fs = require('fs');
const sticky = require('sticky-session');

// 加载HTTPS证书
const sslOptions = {
  key: fs.readFileSync('./private-key.pem'),
  cert: fs.readFileSync('./certificate.pem')
};

const server = https.createServer(sslOptions, (req, res) => {
  const realIp = req.headers['cf-connecting-ip'] || req.connection.remoteAddress;
  res.end(`Worker ${process.pid} handled request from ${realIp}`);
});

sticky.listen(server, 443, {
  hash: (req) => {
    return req.headers['cf-connecting-ip'] || req.connection.remoteAddress;
  }
});

二、改用Cloudflare原生会话粘性

如果不想自行维护sticky-session逻辑,可直接使用Cloudflare内置的会话亲和性(Session Affinity):

  • 登录Cloudflare控制台,进入目标域名管理页
  • 若使用负载均衡,前往「规则」→「负载均衡规则」配置会话亲和性;若未使用负载均衡,在「网络」选项卡中找到「会话亲和性」开启即可
  • 开启后Cloudflare会自动将同一用户的请求转发至同一后端服务器,无需自行处理IP哈希

三、关键注意事项

  • 确保Cloudflare未移除CF-Connecting-IP头,默认配置下该头会被保留
  • 若启用Cloudflare CDN缓存,需区分静态资源与动态请求的缓存规则,避免缓存破坏会话粘性
  • 测试时可打印req.headers确认cf-connecting-ip字段存在,HTTP头大小写不敏感,但Node.js中会统一转为小写

内容的提问来源于stack exchange,提问作者hedoje17473

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:48:21