Express.js Session 中间件的小坑
发布于 4 年前 作者 luicfer 2817 次浏览 最后一次编辑是 3 年前 来自 分享

坑点

直接说什么情况可能会遇到我遇到的坑

  • 用了express-session
  • nginx 做负载均衡并且开启了健康检查

原因

express session 中间件,当用户初次访问网站 cookie 里面没有 sid的时候,会默认生成一个 sid 写入 cookie,同时在服务端保存一个 session。 而 nginx 的健康检查是通过 http 请求返回状态码来检测的。 但是 nginx 发送的请求没有在 cookie 里面带上 sid 导致 中间件认为这是一个新的访问,然后给他设置了一个 session。 每一个 nginx 健康检查的 http 请求都会创建一个 session,导致实际无用的 session 不断增加。

解决方法

  • 自己撸一个新的中间件,默认对没 sid 的情况不自动创建。 只有当自己设置session的时候才创建 sid 写入 cookie ,并在服务器端保存。
  • 关闭 nginx 健康检查
  • 用淘宝的 tengine ,他的健康检查方式多样,可设置的多。
3 回复

查UA怎么样?

@hezedu 通过 ua 过滤 他的健康检查的请求应该也是可行的。 做一个中间件 根据 ua 返回 200,同时不next=。= 不过中间件要放在session 中间件前面

回到顶部