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 という構成をよくやっていました.
参考文献
- Module ngx_http_proxy_module
- 過去に実験したデータ(どっかいった…)