Apache, Lighttpd, nginx における持続的接続と lingering close の実装について

lingering close がなんであるかについては、Apache Performance Tuning - Apache HTTP Server Version 2.2 を参照。

  • Apache 2.2.16 と lighttpd 1.4.28 は、必ずアプリケーションレイヤでの lingering close を行う
  • nginx 0.8.53 は直前に request body があった場合のみ SO_LINGER を利用する
    • これは古い HTTP client が request body のあとに CRLF つけてくることがある対策だと思う
    • HTTP pipelining の関係で RST が飛ぶ場合の対策コードはないかも
    • 一方で、msie6 で POST の場合、あるいは safari だと常に keep-alive を disable するコードが入ってる
      • 理由として closed keep-alive connection に対してリクエストを送ってきてうんぬん、と書いてある *1

コードを関連キーワードで検索して斜め読みしただけなので、間違ってたらご指摘いただければありがたいです。

*1:一般論としては keep-alive connection は、短いタイムアウトと閉じられることが多いから idempotent じゃないメソッドの場合、クライアントは新規接続を開くべきじゃないかなぁ