我正在尝试让Herodocs在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/
我还尝试了一些configuration suggestions。似乎都没有用。
// 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 调试行和错误的不同,我确定这是一个配置问题。但不知道如何解决它。非常感谢任何帮助。
答案 0 :(得分:1)
根据这条线:
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并查看是否有效吗?
答案 1 :(得分:1)
这确实与Heroku上的Redis配置有关。还有其他行需要在I / O Docs app.js中进行更新。
最后,在嗅出生产(Heroku)环境之后,我在顶部(〜第60行)捎带了全局config
对象。
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];
}
我为installing, configuring, and deploying I/O Docs创建了一篇博客文章,其中包含此文章以及运行I / O文档所需的其他更改。如果您对此项目感兴趣,我建议您查看。
感谢 Jan Jongboom 和 Kirsten Jones 帮助我开始。此外,我相信该项目已在GitHub上更新,包括开箱即用的Heroku配置。但是,我还没有测试它。
答案 2 :(得分:0)
我实际上有一篇关于如何让IODocs在Heroku上运行的博客文章。它有一些配置更改,可以让REDIS使用IODocs在Heroku上运行。
http://www.princesspolymath.com/princess_polymath/?p=489
以下是所需的代码更改: 将“var db;”下的以下块添加到app。的:
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配置部分中这样:
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;
}
答案 3 :(得分:0)
最近,更简洁的方法是使用处理配置的redis-url模块。
我个人使用Express with 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
}));
});