5

node.jsエクスプレスアプリのセッションにredisを使用しています。私の開発ボックスでは正常に動作しますが、本番環境では、redisセッションが保存されていないようです。

ログインできないことを除いて、エラーは表示されません。

Redisは同じ構成で実行されています。しかし、実行redis-cliして' select 1'(db)と入力しKEYS '*'ても、何も得られません。

  var RedisStore = require('connect-redis')(express);

  app.use(express.session({
    store: new RedisStore({
      host: cfg.redis.host,
      db: cfg.redis.db
    }),
    secret: 'sauce'
  }));

cfg.redis.hostはlocalhostで、cfg.redis.dbは1です。

これは私が実行したときに私が得るエラーですredis-cli monitor

Error: Protocol error, got "s" as reply type byte
4

1 に答える 1

2

いくつかの提案。Redisが本番環境で同じポートとパスワードを使用していることを確認しますか?HerokuなどのサービスでSSLを使用している場合は、proxy:trueを設定して、SSLが以前に終了した後に到着したCookieをExpressで処理できるようにする必要があります。

   .use(express.session({
        store: new RedisStore({
            port: config.redisPort,
            host: config.redisHost,
            db: config.redisDatabase,
            pass: config.redisPassword}),
        secret: 'sauce',
        proxy: true,
        cookie: { secure: true }
    }))

Redis構成値を渡すには、次のconfig.jsファイルが必要です。

var url = require('url')
var config = {};
var redisUrl;

if (typeof(process.env.REDISTOGO_URL) != 'undefined') {
    redisUrl = url.parse(process.env.REDISTOGO_URL);
}
else redisUrl = url.parse('redis://:@127.0.0.1:6379/0');

config.redisProtocol = redisUrl.protocol.substr(0, redisUrl.protocol.length - 1); // Remove trailing ':'
config.redisUsername = redisUrl.auth.split(':')[0];
config.redisPassword = redisUrl.auth.split(':')[1];
config.redisHost = redisUrl.hostname;
config.redisPort = redisUrl.port;
config.redisDatabase = redisUrl.path.substring(1);

console.log('Using Redis store ' + config.redisDatabase)

module.exports = config;
于 2013-06-24T03:43:08.253 に答える