8

我正在尝试使用 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 环境变量标识)

在开发中我设置

  • 本地主机 = '本地主机'
  • DEVICES_URI = 'http://localhost:3000'

这意味着所有去往 localhost:8000/devices 的请求都被代理到 localhost:3000/devices 这正是我想要的。一切都完美无缺。

问题出在生产中。它给了我一个超时错误,每个请求重复多次。

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

在生产环境变量配置为应用程序名称。

  • 本地主机 = 'lelylan-api.herokuapp.com'
  • DEVICES_URI = 'lelylan-devices.herokuapp.com/'

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

更新

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

在开发中我设置:

  • 本地主机 = '本地主机'
  • DEVICES_URI = 'lelylan-devices.herokuapp.com/'

如果我打电话给http://lelylan-devices.herokuapp.com/devices一切正常。

如果我调用 localhost:8000/devices (指向http://lelylan-devices.herokuapp.com/devices) Heroku 告诉我没有这样的应用程序。我想问题出在路由系统中。

在这里您可以访问源代码。这里是 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
4

2 回答 2

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 标头。

于 2012-08-24T11:01:04.093 回答
2

我在 Heroku 上成功使用了 http-proxy。我在您的日志错误中注意到的第一件事是它正在获取的 url:GET lelylan-api.herokuapp.com/tdevices

有一个错字...而不是 '/devices' 它显示的是 '/tdevices'。在继续之前,您可以确认这是实际的日志消息吗?

于 2012-08-23T18:40:30.667 回答