我有多个带有负载均衡器的koa服务器,使用护照登录。我想在所有服务器上保持会话。
我的第一次尝试是将会话存储设置为mysql数据库,但这导致服务器在每个请求上调用mysql,从而导致性能问题。
我想将会话对象保留在每个服务器的RAM中,如果用户被负载均衡器重定向到另一台服务器并且服务器无法识别cookie,我希望它能够回退到数据库并将数据加载到其RAM中 有没有办法做到这一点?
感谢。
答案 0 :(得分:3)
要存储会话,您可以使用一些键值内存数据库,在大多数情况下,它可以是redis,memcached或mongodb。你需要分配服务器,你将安装赞赏的软件,然后配置koa使用它们。在lib和example实施后,我想建议您使用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);