Node.jsでTCPプロキシを作っていて以下の様にFIN_WAIT2が残り続けてしまう場合に遭遇したので。
環境は CL -> PROXY(node.js) -> ELB(TCP MODE) -> SV
SVは無言で再起動かかる環境。
tcp 0 0 ip-172-31-13-220.ap-n:41594 ec2-x-x-x-161.ap-:8333 FIN_WAIT2
tcp 0 0 ip-172-31-13-220.ap-n:33570 ec2-x-x-x-177.ap-:8333 FIN_WAIT2
tcp 0 0 ip-172-31-13-220.ap-n:41728 ec2-x-x-x-161.ap-:8333 FIN_WAIT2
tcp 0 0 ip-172-31-13-220.ap-n:41724 ec2-x-x-x-161.ap-:8333 FIN_WAIT2
切断にendのみ、使っていたがそれだと問題が起きる
socket.end(); // shutdownに相当?
ドキュメント読むとNode.jsのsocket.endはBSD SOCKETのshutdownに相当するようで
この段階ではまだhalfclose状態なので相手からACKが来るのを待っている
来なければ一生待つので破棄命令を付け加える
socket.end();
socket.destroy(); // closeに相当?
※ 呼ぶタイミングはend直後で大丈夫そうだが、どのタイミングでdestroyを呼べばいいのかあとでソース読んで検討。
※ OSのtcp_fin_timeoutパラメータで対応できると思ったがうまくいかない
※ プロキシ作った理由が元のjavaのプログラムが一度DNSを引いたらそのIPアドレスを永遠に使うのでELBと相性が悪かった
Socket.destroySoon()を呼べばいいのだろうか?
node/lib/net.js
Socket.prototype.destroySoon = function() {
if (this.writable)
this.end();
if (this._writableState.finished)
this.destroy();
else
this.once('finish', this.destroy);
};