Posted at

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

More than 1 year has passed since last update.

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 という構成をよくやっていました.


参考文献