Apacheとnginxのリバースプロキシ挙動差(バッファリング)

Apacheとnginxでは,リバースプロキシのバッファリングにまつわる挙動差があります.

nginx

  • デフォルトでリクエストはバッファリングされる.
  • 転送先へのリクエストは,nginxがリクエストを受信し終えた後.
  • ただし,nginx 1.7.11以降はproxy_request_bufferingオプションで無効化できる.

Apache

  • リクエストはバッファリングされない.
  • 転送先へのリクエストは,Apacheのリクエスト受信途中から.

バッファリングによる利点・欠点

利点

  • 低速なクライアントの影響を受けない.
    • unicornのworkerがリクエスト受信待ちで占有… ということがなく,workerが効率良く捌けるようになる.
    • 転送先Webアプリケーションのセッション数(unicornのworker数)が限られる場合は効果的.

欠点

  • メモリやディスクを消費する.
    • リクエストが数百MBを超えたり,塵も積もればの大量リクエストがある場合は,ディスクI/Oがボトルネックになり得ます.
    • client_body_buffer_sizeでメモリへのバッファサイズをチューニングできますが,消費はします.
  • 転送先へのリクエスト送信がわずかに遅れる.
    • バッファリングなしで随時送信するよりは,わずかに遅くなります.わずかにですが.

せいぜい数百KBのアップロードだけど,低速なMVNO回線でしょっちゅう利用する(利用される)…
というWebアプリケーションなんかは,バッファリングの利点目当てに Debian+nginx+unicorn+Rails という構成をよくやっていました.

参考文献

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.