5

スーパーエージェントを使用してHTTPリクエストを別のサーバーBに発行するnode.jsサーバーAを実行しています。

サーバー B でリクエストを調査したところ、ヘッダーconnectionが次closeのとおりであり、httpVersion が1.1次のとおりであることがわかりました。

var http = require('http');
var request = require('superagent');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('req.httpVersion seen on server:' + req.httpVersion);
  res.write('\nreq.headers.connection seen on server:' + req.headers.connection);
  res.end();
}).listen(1337, '0.0.0.0');

request
  .get('localhost:1337/helloword')
  .end(function (err, res) {
    console.log(res.text);
  });

これはにつながります:

req.httpVersion seen on server:1.1
req.headers.connection seen on server:close

ただし、ブラウザから同じサーバーにアクセスすると、次のようになります。

req.httpVersion seen on server:1.1
req.headers.connection seen on server:keep-alive

https://www.rfc-editor.org/rfc/rfc2616#page-172から keep-aliveConnection: close. _

だから、私の質問は次のとおりです。

  • Superagent / Node.js がキープアライブ / 永続接続を使用しないようにリクエストを明示的に設定するのはなぜですか?
  • Superagent / Node.js にキープアライブ接続を使用させるにはどうすればよいですか?
  • 正確な動作にさらに影響を与えるにはどうすればよいですか (開いたままにする接続の数、タイムアウトなど)。
4

3 に答える 3

12

文書化されていないようですが、関数で http エージェントを superagent に渡すことができますagent。したがって、このモジュールを使用してキープアライブ エージェントを作成できます: https://www.npmjs.org/package/agentkeepaliveをスーパーエージェントに渡します。

このようなもの:

util = require('util');
util.debuglog = require('debuglog');
var http = require('http');
var request = require('superagent');
var Agent = require('agentkeepalive');

var keepaliveAgent = new Agent({
  maxSockets: 100,
  maxFreeSockets: 10,
  timeout: 60000,
  keepAliveTimeout: 30000 // free socket keepalive for 30 seconds
});

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('req.httpVersion seen on server:' + req.httpVersion);
  res.write('\nreq.headers.connection seen on server:' + req.headers.connection);
  res.end();
}).listen(1337, '0.0.0.0');

request
  .get('localhost:1337/helloword')
  .agent(keepaliveAgent)
  .end(function (err, res) {
    console.log(res.text);
  });
于 2014-10-12T10:51:26.447 に答える