【问题标题】:How configure Redis Store for my production env?如何为我的生产环境配置 Redis Store?
【发布时间】:2015-02-23 22:26:02
【问题描述】:

我正在尝试为会话存储设置 Redis,但无法正常工作。我正在使用passport.jsexpress-flash,如果我尝试运行当前的 Redis 设置,它将无法正常工作:

var session = require('express-session');
var favicon = require('serve-favicon');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var redis = require("redis").createClient();
var RedisStore = require("connect-redis")(session);

var load = require('express-load');
var flash = require('express-flash');
var path = require('path');
var logger = require('morgan');
var i18n = require('i18n-2');
var passport = require('passport');
var mongoose = require('mongoose');

如果我使用此会话设置:

app.use(session({
  secret: 'keyboard cat'
}));

这将显示一个错误,指出在生产环境中使用不安全,但 passport.js 和 express-flash 可以工作。

继续使用 Redis:

app.use(session({
  store: new RedisStore({
     host: 54.94.171.197, 
     port: 3000,
     client: redis
   }),
  secret: 'keyboard cat'
}));

我应该把静态IP放在主机里,把3000放在端口里吗?我对需要传递给新实例的正确值感到非常困惑。

这是我的中间件:

app.use(favicon(__dirname + '/public/images/icons/fav.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(flash());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
  store: new RedisStore({
    host: global.config.site.host,
    port: 6379,
    client: redis
  }),
  secret: 'keyboard cat'
}));

// Productions Middlewares

if (process.env.NODE_ENV === 'production') {
  app.use(passport.initialize());
  app.use(passport.session());
  app.use('/admin', middleware.ensureAuthenticated);
  app.use(middleware.ensureHttps);
}

【问题讨论】:

  • 您的具体问题是什么?你能显示错误吗?

标签: javascript node.js express redis


【解决方案1】:

将应用程序的配置放在代码中是不好的做法。

使用nconf 之类的东西来让你的配置脱离代码。

例如,您可以使用config.json 文件:

{
    "sessionSecret": "cat something",
    "redis": {
        "host": "localhost",
        "port": 6379
    }
}

配置nconf查找配置文件

var nconf = require('nconf');
nconf.file({ file: '/path/to/config.json' })

然后在你的会话中间件中使用配置

app.use(session({
  store: new RedisStore({
     host: nconf.get('redis:host'),
     port: nconf.get('redis:port'),
     client: redis
   }),
  secret: nconf.get('sessionSecret')
}));

【讨论】:

  • 明白了,但是@Bertrand Marron 的主机和端口呢?我应该把我的静态IP放在主机中吗?我正在创建两台服务器,一台 http 和一台 https,如何定义我需要在端口键中插入的端口?我为 http 使用 3000,为 https 使用 443
  • 什么?这是您的 Redis 主机的配置,而不是 Web 服务器。
  • 另外,您可能不应该使用节点应用程序监听 443。相反,更喜欢使用将侦听 443 并执行 SSL 的反向代理(如 nginx),使用 HTTP(而不是 HTTPS)使用任意端口(3000 很好)在反向代理和您的节点应用程序之间进行通信。
  • 嗯,太好了!.. 非常感谢@Bertrand。这是我第一个真正运行的带有节点的应用程序,我有点迷路了呵呵..
  • Bertrand,如果我尝试像您回答的那样使用 Redis(我复制并粘贴),则 passport.js 和 express-session 将停止并抛出错误:错误:req.flash() 需要会话
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多