0

プロキシを 1 つの localhost ポートにリバースしようとしているノード プロセスがいくつかあります。Node-http-proxy は、最も単純なソリューションのように思えました。Express を実行している 2 つの node.js プロセス (以下の例ではポート 3100 & 3000) と、restify を使用して node.js を実行しているプロセス (2700) にプロキシしています。

var http = require('http'),
    httpProxy = require('http-proxy');

var proxy = httpProxy.createProxyServer({});

var server = require('http').createServer(function(req, res) {
    if (req.url.match(/^(\/api\/search|\/api\/suggest)/g)) {
        proxy.web(req, res, { target: 'http://127.0.0.1:2700' });
    } else if (req.url.match(/^\/pages\//g)){
        proxy.web(req, res, { target: 'http://127.0.0.1:3100' });
    } else {
        proxy.web(req, res, { target: 'http://127.0.0.1:3000' });
    }
});

server.listen(9999);

そのため、テスト中に、9999 のサーバーが約 100 サーブ後にファイルの提供を停止し、node-http-proxy プロセスがスローしていることに気付き始めました。

{ [Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect' }

EMFILE は通常、開いているファイルの制限 OS によって引き起こされることを知っています。上限を上げることはできますが、それは役に立たないと思います。100 ミリ秒ごとにループ接続を実行して、3000、3100、および 2700 でサーバーへのアクセスを実行しようとしましたが、問題なく何千ものサーバーで問題なく動作しました。また、これを nginx リバース プロキシの背後で実行しましたが、何千ものサーバーで正常に動作しています。私は node-http-proxy で何か間違ったことをしているように感じます-何かを閉じていないようです。何か案は?

4

1 に答える 1

1

これは、エージェントが渡されなかったため、ノードが新しいエージェントを割り当ててすべてのリクエストを処理し、ノードがキープアライブによってリクエスト後に接続を強制終了しないため、リークする可能性が高いためです。

一時的な解決策:-

1 - すべてのリクエストに新しいエージェントを割り当てることができます

var proxy = httpProxy.createProxyServer({agent: new http.Agent()});

2-リクエストヘッダーの近くで接続を送信します

server = http.createServer(function(req, res) {
  req.headers.connection = "Close";
  return proxy.web(req, res, {
    target: 'http://127.0.0.1'
  });
});

参照:-

https://github.com/nodejitsu/node-http-proxy/issues/570

https://github.com/nodejitsu/node-http-proxy/pull/572

https://github.com/nodejitsu/node-http-proxy/pull/573

于 2015-01-04T05:16:59.867 に答える