在Heroku上使用Node.js的代理服务器

时间:2012-08-23 16:49:49

标签: node.js heroku proxy

我正在尝试使用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 ='localhost'
  • DEVICES_URI ='http:// localhost:3000'

这意味着所有发往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

在制作中,环境变量被配置为应用程序名称。

  • LOCALHOST ='lelylan-api.herokuapp.com'
  • DEVICES_URI ='lelylan-devices.herokuapp.com/'

我想我错了一些配置,但一整天后我还在 无法弄清楚。

更新

我继续我的测试,我发现代理无法访问完全阻止我的代理服务。

在开发中我设置:

  • LOCALHOST ='localhost'
  • DEVICES_URI ='lelylan-devices.herokuapp.com /'

如果我致电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

2 个答案:

答案 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'。在继续之前,您能否确认这是实际的日志消息?