どうも、王子の弟子、かっぱ(@inokara)です。

はじめに

王子に教えてもらったことをメモ。今回はリバースプロキシ(ELB 以外)配下の KeepAlive 設定セオリーについて。

王子の教え

リバースプロキシのセオリーは

  • バックエンドサーバーの keepalive は off(ソケットの開放を早め、次のコネクションに再利用するのが目的)
  • フロントはOn

ただし…上記のようなセオリーが生まれたのは…

  • Apache prefork でバックエンドが稼働する事が多かったから
  • Prefork はプロセスを fork して増やすが、同時にフォークプロセスによってメモリも消費する為
  • 昔は搭載メモリも少なかった為、再利用性を向上させる為

とのこと。尚、このパラメーターを決めるのはアプリケーションも含めた総メモリ消費量となる。

但し

最近ではアプリケーションの実装等も進歩してメモリ消費量も下がってきておりコネクション性能も向上しているのは注意しながら KeepAlive を On にすることも検討は出来る。(但し、リスクもあるので注意する)

そして ELB は…

ググると上記のリバースプロキシ配下は KeepAlive Off というセオリーは通用していない。むしろ ON にしましょうという意見を見かける。こちらを抜粋させて頂くと…

  • ELB は TCP を単にリレーしているのではなくて、アプリケーションレイヤのプロキシであることによるものが大きい
  • ELB はバックエンドの EC2 との間で無通信の場合でも 60 秒はセッションを維持する
  • ELB は TCP Persistent Connection を提供し、 Web サーバとの間の TCP セッションをつかいまわすことによって TCP のハンドシェイク時間を削減して高速化している
  • そもそも ELB が TCP のセッションを維持するのにどんだけメモリを食っていようが、そんなことはユーザの知ったことではない

ということなので ELB の場合には配下のサーバーは KeepAlive を ON にしましょう。

まとめ

なんとなく知っていたことも王子に紐解いて教えてもらって理解を深めることが出来ました。

元記事は、こちらです。