使用redis作为会话存储,通过nginx在Nodejs中加载平衡

Moh*_*ani 6 session load-balancing nginx redis node.js

我尝试使用redis作为会话存储,通过nginx在Nodejs中加载Balance.

我正在使用3台机器

  1. 机器A(192.168.14.65) - 安装Nginx,Redis
  2. 机器B(192.168.14.92) - 已安装nodejs
  3. 机器C(192.168.9.9) - 已安装nodejs

我在机器B中设置了一个会话变量,我试图通过机器C访问同一个会话变量.

我使用redis作为会话存储,所以我应该访问机器B中的变量.

机器B的编码是(文件名为app.js)

var express = require('express');
var redis   = require("redis");
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var client  = redis.createClient();
var app = express();

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: '192.168.14.65', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
}));


app.get('/', function (req, res) {
  console.log(req.session);
  req.session.helloworld = 'helloworld';
  res.send('set session');

});

app.listen(3000,function(){
    console.log("App Started on PORT 3000");
});
Run Code Online (Sandbox Code Playgroud)

机器C的编码是(文件名为app.js)

var express = require('express');
var redis   = require("redis");
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var client  = redis.createClient();
var app = express();

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: '192.168.14.65', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
}));


app.get('/', function (req, res) {
  if(req.session.helloworld) {
    res.send('get session: '+ req.session.helloworld);
  } else {
    res.send('no session: ');
  } 

});

app.listen(3000,function(){
    console.log("App Started on PORT 3000");
});
Run Code Online (Sandbox Code Playgroud)

我在两台机器上都有package.json

package.json代码

{
  "name": "Node-Session-Redis",
  "version": "0.0.1",
  "scripts": {
    "start": "node ./bin"
  },
  "dependencies": {
    "async": "^1.2.1",
    "body-parser": "^1.13.0",
    "connect-redis": "^2.3.0",
    "cookie-parser": "^1.3.5",
    "ejs": "^2.3.1",
    "express": "^4.12.4",
    "express-session": "^1.11.3",
    "mysql": "^2.7.0",
    "redis": "^0.12.1"
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用命令运行代码

node app.js
Run Code Online (Sandbox Code Playgroud)

机器B一切正常.

但是我在Machine C中遇到了一些错误.

TypeError: Cannot read property 'helloworld' of undefined
    at /home/local/PAYODA/balachandran.v/js/app.js:19:17
    at Layer.handle [as handle_request] (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/layer.js:95:5)
    at /home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/index.js:330:12)
    at next (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/index.js:271:10)
    at session (/home/local/PAYODA/balachandran.v/js/node_modules/express-session/index.js:159:61)
    at Layer.handle [as handle_request] (/home/local/PAYODA/balachandran.v/js/node_modules/express/lib/router/layer.js:95:5)
Run Code Online (Sandbox Code Playgroud)

当我在控制台中尝试req.session时,机器B机器B出错了.

{ cookie:     { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
Run Code Online (Sandbox Code Playgroud)

机器C错误

undefine
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我哪里错了吗?提前致谢