node.js и Redis на Heroku для IODocs
Я пытаюсь заставить IODoc работать на 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 не работал. Из того, что я могу сказать, надстройка 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 To Go и ошибке, я уверен, что это проблема конфигурации. Но не знаю, как это исправить. Любая помощь с благодарностью.
4 ответа
Это действительно было связано с конфигурацией для Redis на Heroku. Были дополнительные строки, которые требовали обновления в I/O Docs app.js.
В конце концов, я поддержал глобальные 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 вручную и посмотреть, работает ли это?
В последнее время более понятным способом было бы использовать модуль redis-url, который обрабатывает конфигурацию.
Я лично использую Express с Redis (через дополнение Redis To Go) в качестве sessionStore, и он хорошо работает на Heroku.
Пример:
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
}));
});
На самом деле у меня есть запись в блоге о том, как заставить IODoc работать над Heroku. В нем есть изменения конфигурации, необходимые для работы REDIS на Heroku с IODocs.
http://www.princesspolymath.com/princess_polymath/?p=489
Вот необходимые изменения кода: Добавьте следующий блок под "var db;" в app.'s:
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);
}
И затем это в разделе Load API Configs, после прочтения файла конфигурации:
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;
}