在多个服务器上保持koa会话

时间:2015-05-05 08:58:29

标签: javascript mysql node.js session koa

我有多个带有负载均衡器的koa服务器,使用护照登录。我想在所有服务器上保持会话。

我的第一次尝试是将会话存储设置为mysql数据库,但这导致服务器在每个请求上调用mysql,从而导致性能问题。

我想将会话对象保留在每个服务器的RAM中,如果用户被负载均衡器重定向到另一台服务器并且服务器无法识别cookie,我希望它能够回退到数据库并将数据加载到其RAM中 有没有办法做到这一点?

感谢。

3 个答案:

答案 0 :(得分:3)

要存储会话,您可以使用一些键值内存数据库,在大多数情况下,它可以是redismemcachedmongodb。你需要分配服务器,你将安装赞赏的软件,然后配置koa使用它们。在libexample实施后,我想建议您使用redis。

答案 1 :(得分:0)

我的答案很晚,但大多数负载均衡都可以选择"sticky sessions"(请参阅会话持久性),这意味着来自同一IP的请求将路由到同一进程。也许试试这个!

答案 2 :(得分:0)

您可以使用koa-session https://github.com/koajs/session

这是一个很好的教程http://www.zev23.com/2014/03/koajs-tutorial-authenticate-with_7.html

从教程中复制完整的app.js.

"use strict"

const
  Router = require('koa-router'),
  passport = require('./auth'),
  session = require('koa-sess'),
  redisStore = require('koa-redis'),
  koa = require('koa'),
  app = koa();

//Middleware: request logger
function *reqlogger(next){
  console.log('%s - %s %s',new Date().toISOString(), this.req.method, this.req.url);
  yield next;
}
app.use(reqlogger);

//Initialize session
app.keys=['koa-tutorial'];
app.use(session({
  cookie: {maxAge: 1000 * 60 * 5},
  store : redisStore()
}));

//Initialize passport with session
app.use(passport.initialize());
app.use(passport.session());

app.use(Router(app));

app.get('/', function *(){
  console.log('Express-style example');
  this.body = "This is root page ('/')";
});

const publicRouter = new Router();

//Configure /auth/github & /auth/github/callback
publicRouter.get('/auth/github', passport.authenticate('github', {scope: ['user','repo']}));
publicRouter.get('/auth/github/callback',
  passport.authenticate('github', {successReturnToOrRedirect: '/', failureRedirect: '/'})
);

app.use(publicRouter.middleware());

//Secures routes
const securedRouter = new Router();

//Middleware: authed
function *authed(next){
  if (this.req.isAuthenticated()){
    yield next;
  } else {
    //Set redirect path in session
    this.session.returnTo = this.session.returnTo || this.req.url;
    this.redirect('/auth/github');
  }
}

securedRouter.get('/app', authed, function *(){
  this.body = 'Secured Zone: koa-tutorial\n' + JSON.stringify(this.req.user, null, '\t');
});

securedRouter.get('/app2', authed, function *(){
  this.body = 'Secured Zone: koa-tutorial APP2\n'
});

app.use(securedRouter.middleware());

app.use(function *(){
  this.body = 'Hello World';
});

app.listen(3000);