我正在尝试使用http-proxy在Heroku上使用Node.js构建代理服务器。 一切都在当地很好用,但我在Heroku上遇到了一些麻烦。
var http = require('http');
var httpProxy = require('http-proxy');
settings = {
"localhost": process.env.LOCALHOST,
"devices": process.env.DEVICES_URI
}
var options = { router: { } }
options.router[settings.localhost + '/devices'] = settings.devices + '/devices';
var port = process.env.PORT || 8000;
var server = httpProxy.createServer(options).listen(port);
正如您在示例中所见,我设置了一个路由对象。我说的是这样的: 当请求与'/ devices'匹配时,将请求路由到设备服务。 (由DEVICES_URI环境变量识别)
在开发中我设置了
这意味着所有发往localhost:8000 / devices的请求都被代理 localhost:3000 /设备这就是我想要的。一切都很完美。
问题在于生产。它给了我多次重复的超时错误 对于每个请求。
2012-08-23T20:18:20+00:00 heroku[router]: Error H12 (Request timeout) -> GET lelylan-api.herokuapp.com/devices dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
在制作中,环境变量被配置为应用程序名称。
我想我错了一些配置,但一整天后我还在 无法弄清楚。
更新
我继续我的测试,我发现代理无法访问完全阻止我的代理服务。
在开发中我设置:
如果我致电http://lelylan-devices.herokuapp.com/devices,一切正常。
如果我调用localhost:8000 / devices(指向http://lelylan-devices.herokuapp.com/devices)Heroku告诉我没有这样的应用程序。我想这个问题在某种程度上是在路由系统中。
您可以在source code访问此处。 这里是Heroku的配置变种。
NODE_ENV => production
LOCALHOST => lelylan-api.herokuapp.com
DEVICES_URI => lelylan-devices.herokuapp.com
TYPES_URI => lelylan-types.herokuapp.com
LOCATIONS_URI => lelylan-locations.herokuapp.com
答案 0 :(得分:5)
我最终使用略微修改的版本proxy-by-url使其工作。最终的代码看起来像这样,工作正常。
var httpProxy = require('http-proxy');
var port = process.env.PORT || 8000;
var routing = {
'/devices': { port: process.env.DEVICES_PORT || 80, host: process.env.DEVICES_URI }
}
var server = httpProxy.createServer(
require('./lib/uri-middleware')(routing)
).listen(port);
要记住一个注意事项。该插件将标头HOST设置为目标应用程序uri。如果您不这样做,Heroku将无法识别该应用程序,也无法找到它,因为其内部路由系统似乎基于HOST标头。
答案 1 :(得分:2)
我在Heroku上成功使用http-proxy。我在你的日志错误中注意到的第一件事是它正在获取的网址: 获取lelylan-api.herokuapp.com/tdevices
有一个拼写错误...而不是'/ devices'它显示'/ tdevices'。在继续之前,您能否确认这是实际的日志消息?