如何结合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
相关产品推荐
相关产品推荐

