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 環境変数によって識別されます)

開発中に私が設定した

  • LOCALHOST = 'ローカルホスト'
  • 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

本番環境では、環境変数はアプリ名に設定されています。

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

いくつかの構成が間違っていると思いますが、1日経ってもまだ理解できません。

アップデート

テストを続行しましたが、プロキシがプロキシされたサービスに到達できず、完全に停止することがわかりました。

開発では、次のように設定しました。

  • LOCALHOST = 'ローカルホスト'
  • 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);

覚えておくべき1つのメモ。プラグインは、ヘッダー HOST を宛先アプリケーション uri に設定します。そうしないと、Heroku はアプリを認識せず、見つけることができません。内部ルーティング システムは HOST ヘッダーに基づいているようです。

于 2012-08-24T11:01:04.093 に答える
2

Heroku で http-proxy を正常に使用しています。あなたのログ エラーで最初に気付いたのは、GETting の URL です: GET lelylan-api.herokuapp.com/tdevices

タイプミスがあります...「/devices」の代わりに「/tdevices」が表示されます。続行する前に、これが実際のログ メッセージであることを確認できますか?

于 2012-08-23T18:40:30.667 に答える