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でセッションを維持しているのにApache側でタイムアウトすると、この恩恵を受けることが出来ません。 維持しているセッションが切れてしまうので、切れたセッションを繋ぎ直す無駄な処理が走ることになるでしょう。
また、タイムアウト値が小さいとELBとApacheとの間でタイムアウトが発生してしまう可能性もでてきます。
これらの理由から、ELBをフロントに配置する場合は、KeepAliveTimeout
やTimeOut
の値に気をつける必要があります。
まとめ
ELBバックエンドのApacheの設定は推奨値を使いましょう。