Вопрос

Я пытаюсь заставить йодоки бежать на Heroku. Это требует node.js и redis. По общему признанию, я новичок во всех этих технологиях. Тем не менее, мне удалось выполнить его на местном уровне. Тем не менее, я получаю следующую ошибку при развертывании в Heroku.

2011-12-01T11:55:18+00:00 app[web.1]: Redis To Go - port: 9030 hostname: dogfish.redistogo.com
2011-12-01T11:55:18+00:00 app[web.1]: Express server listening on port 9694
2011-12-01T11:55:19+00:00 heroku[web.1]: State changed from starting to up
2011-12-01T11:55:21+00:00 app[web.1]:         ^
2011-12-01T11:55:21+00:00 app[web.1]: Error: Redis connection to localhost:6379 failed - ECONNREFUSED, Connection refused
2011-12-01T11:55:21+00:00 app[web.1]:     at Socket.<anonymous> (/app/node_modules/redis/index.js:123:28)
2011-12-01T11:55:21+00:00 app[web.1]:     at Socket.emit (events.js:64:17)
2011-12-01T11:55:21+00:00 app[web.1]:     at Array.<anonymous> (net.js:828:27)
2011-12-01T11:55:21+00:00 app[web.1]:     at EventEmitter._tickCallback (node.js:126:26)
2011-12-01T11:55:23+00:00 heroku[web.1]: State changed from up to crashed

Единственный раз, когда я получил подобное предупреждение о моем местном спаривании, было, когда Редис не бежал. Из того, что я могу сказать, дополнение Redis включено для моего приложения и запуска:

$ heroku config --long
NODE_ENV      => production
PATH          => bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin
REDISTOGO_URL => redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/

Я также попробовал немного конфигурация предложения. Анкет Кажется, никто не работает.

// redis connection in app.js
var db;
if (process.env.REDISTOGO_URL) {
   var rtg = require("url").parse(process.env.REDISTOGO_URL);
// tried this line as well... gave a different error on .connect();
// db = require('redis-url').connect(process.env.REDISTOGO_URL);
   db = redis.createClient(rtg.port, rtg.hostname);
   db.auth(rtg.auth.split(":")[1]);

   // debug
   sys.puts('Redis To Go - port: ' + rtg.port + ' hostname: ' + rtg.hostname);
} else {
   db = redis.createClient(config.redis.port, config.redis.host);
   db.auth(config.redis.password);
}

От разницы в моем Redis, чтобы пойти Линия отладки и Ошибка, Я уверен, что это проблема конфигурации. Но не знаю, как это исправить. Любая помощь очень ценится.

Это было полезно?

Решение 2

Это действительно связано с конфигурацией для Redis на Heroku. Были дополнительные строки, которые требовали обновлений в приложении Docs ввода/вывода.

В конце концов, я поддерживал глобальный config Объект наверху (~ линия 60) после выходов среды производства (Heroku).

if (process.env.REDISTOGOURL) {
  // use production (Heroku) redis configuration
  // overwrite config to keep it simple
  var rtg = require(‘url’).parse(process.env.REDISTOGOURL);
  config.redis.port = rtg.port;
  config.redis.host = rtg.hostname;
  config.redis.password = rtg.auth.split(“:”)[1];
}

Я создал сообщение в блоге для Установка, настройка и развертывание документов ввода/вывода Это включает в себя это, а также другие изменения, которые необходимы для запуска документов ввода -вывода. Я рекомендую вам просмотреть его, если вы заинтересованы в этом проекте.

Благодаря Ян Чонбум а также Кирстен Джонс за помощь мне начать. Кроме того, я считаю, что проект был обновлен в GitHub, чтобы включить конфигурацию Heroku из коробки. Однако я еще не проверил это.

Другие советы

Согласно этой строке:

2011-12-01T11:55:21+00:00 app[web.1]: Error: Redis connection to localhost:6379 failed - ECONNREFUSED, Connection refused

Вы пытаетесь подключиться к localhost:6379, но сервер Redis работает на redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/. Анкет Можете ли вы попробовать подключиться к этому URL -адресу вручную и посмотреть, работает ли это?

У меня на самом деле есть сообщение о том, как заставить йодоки работать над Heroku. У него есть изменения конфигурации, необходимые для того, чтобы Redis работал на Heroku с йоодоками.

http://www.princesspolymath.com/princess_polymath/?p=489

Вот необходимые изменения кода: добавьте следующий блок под «var db;»; приложения.

if (process.env.REDISTOGO_URL) {
   var rtg   = require("url").parse(process.env.REDISTOGO_URL);
   db = require("redis").createClient(rtg.port, rtg.hostname);
   db.auth(rtg.auth.split(":")[1]);
} else {
   db = redis.createClient(config.redis.port, config.redis.host);
   db.auth(config.redis.password);
}

А затем это в разделе конфигураций API загрузки после прочтения файла конфигурации:

var app = module.exports = express.createServer();
var hostname, port, password
if (process.env.REDISTOGO_URL) {
    var rtg   = require("url").parse(process.env.REDISTOGO_URL);
    hostname = rtg.hostname;
    port = rtg.port;
    password = rtg.auth.split(":")[1];
} else {
    hostname = config.redis.host;
    port = config.redis.port;
    password = config.redis.password;
}

Недавно более чистым способом будет использование Redis-Url модуль, который обрабатывает конфигурацию.

Я индивидуально использую Express с Redis (через Redis, чтобы перейти, в качестве сеанса -магазина, и это хорошо работает на Heroku.

Exemple:

const express           = require('express')

    , redis             = process.env.REDISTOGO_URL 
        ? require('redis-url').connect(process.env.REDISTOGO_URL) 
        : require('redis').createClient()

    , RedisStore        = require('connect-redis')(express)
    , sessionStore      = new RedisStore({ client: redis })
    , app               = express.createServer();

[...]

app.configure(function() {
    this
        .use(express.session({
            secret: 'mySecretHash', 
            store: sessionStore // Set redis as the sessionStore for Express
        }));
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top