【问题标题】:Keep session in koa on multiple servers在多台服务器上保持 koa 中的会话
【发布时间】:2015-07-14 22:03:46
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: javascript mysql node.js session koa


    【解决方案1】:

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

    【讨论】:

    • 嗨。感谢您的回答,但正如我所写,我尝试使用集中式存储,但这每次都会导致对存储的请求。如果会话不在当前服务器中,我希望集中存储成为后备。
    • @AviTshuva 该存储被设计为会话存储,因为它们也是内存中的并且比您尝试过的 MySQL 更快。
    • 但它们仍在远程服务器上,这是我想避免的开销,除非我必须这样做。
    【解决方案2】:

    我的回答很晚,但大多数负载平衡器都有"sticky sessions" 选项(请参阅会话持久性),这意味着来自同一 IP 的请求被路由到同一进程。不妨试试这个!

    【讨论】:

      【解决方案3】:

      你可以使用 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多