Node.jsでERR_CONNECTION_RESETが発生したときの対処

Node.js+Expressで構築したサーバーに対し、Ajax+FormDataを使って、写真データのアップロード処理をおこなっていたところ、大量データを一度にアップロードすると、途中で止まってしまう現象を解消させたときの忘備録。

  • 一眼レフで1枚当たり3MB程度の写真を700枚送信
  • テスト環境(ローカルホスト起動)の時は発生せず
  • 本番環境だと2分程度で、ChromeのデベロッパーツールのコンソールにERR_CONNECTION_RESETが表示される

最初にアップロード機能として使用しているmulterモジュールのファイル数やファイルサイズの上限を疑ったが、デフォルトはどちらも無制限のようで関係なし。

ajaxのオプションで指定できるtimeout属性も疑ったが、そもそもプログレス処理で逐一応答しているので問題なさそう。

ローカルのデバッグ環境では、完走しているので通信量の問題というよりも通信時間に着目。どうしても本番環境の方が通信時間が長くなるので、これが原因ではないかと疑ったらアタリでした。

var http = require( 'http' );
var server = http.createServer( app );
var port = 3004;

// 通信時間をデフォルトの120000[msec](2分)から1800000[msec](30分)に変更
server.timeout = 30* 60 * 1000;

server.listen( port );

上記はサーバーの起動時の処理の抜粋だが、server.timeoutの値を増やしたところ、700枚のアップロードでも完走するようになった。