ELBのタイムアウトを回避するためApacheのKeepAliveTimeoutを設定する

渡辺です。 最近、ビックコミックスの「アオアシ」ってサッカー漫画がお気に入りです。 同じサッカー漫画のジャイアントキリングと共に、チームビルディングやコーチングのヒントなども学べます。

さて、今回はELBをフロントエンドに配置したApacheの推奨設定です。 過去エントリーあるかなと思いましたが、なかったので書いておきましょう。 What are the optimal settings for using Apache as a back-end server for ELB?で説明されています。

KeepAliveTimeoutをELBアイドルタイムアウトの値以上にする

結論としては、 KeepAliveTimeoutを60秒以上 に設定します。 60秒というのはELBのアイドルタイムアウトのデフォルト値です。

AWSのドキュメントでは120秒を推奨値としています。 その他の推奨値を反映すると次のようなconfファイルとなります。

<VirtualHost *:80>
  ServerName   www.example.com
  DocumentRoot /var/www/html/
  Timeout 120
  KeepAlive On
  KeepAliveTimeout 120
  MaxKeepAliveRequests 100
  AcceptFilter http none
  LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
</VirtualHost>

ELBのセッション維持

この設定が推奨されている理由は、 ELBのセッション維持 を有効に利用するためです。 ELBではリクエストが無くとも、バックエンドサーバとのセッションを維持します。 セッション維持時間のデフォルト値は60秒 です。 Apacheとのセッションが維持されることで、無駄なハンドシェイクなどがスキップできるため、ELBの性能を発揮できるようになります。

ELB_TIMEOUT

ところが、ELBでセッションを維持しているのにApache側でタイムアウトすると、この恩恵を受けることが出来ません。 維持しているセッションが切れてしまうので、切れたセッションを繋ぎ直す無駄な処理が走ることになるでしょう。

また、タイムアウト値が小さいとELBとApacheとの間でタイムアウトが発生してしまう可能性もでてきます。

これらの理由から、ELBをフロントに配置する場合は、KeepAliveTimeoutTimeOutの値に気をつける必要があります。

まとめ

ELBバックエンドのApacheの設定は推奨値を使いましょう。