ELBのヘルスチェックで408 Request Timeoutを解消する

Apache2.4系で、ELB(Classic)を使用している環境で、Apacheのアクセスログに以下のエラーが頻繁に出力しているのを偶然発見しました。

   :
172.31.28.81 - - [02/Jun/2017:19:30:53 +0900] "-" 408 - "-" "-"
172.31.28.81 - - [02/Jun/2017:19:30:53 +0900] "-" 408 - "-" "-"
   :

正常時のログ

   :
172.31.11.74 - - [02/Jun/2017:19:30:54 +0900] "GET /healthcheck HTTP/1.1" 200 12 "-" "ELB-HealthChecker/1.0" 
   :

ヘルスチェックの方法は以下のようにして設定しています。

【原因と思われるもの】

ELBのアイドルタイムアウト値の方が長い為、apacheが該当TCPコネクションを切断しているため、408(タイムアウト)となってしまう模様。

ELBタイムアウト値

ELBがEC2のWebサーバに対して、コネクションをはっており、デフォルト設定で60秒で設定されています。

Apache2.4のRequestReadTimeoutディレクティブのデフォルト値
header=20-40,MinRate=500 body=20,MinRate=500

【対応】

現在、以下の状況ではエラーとなる。
ELB:Idle Timeout値60秒
Apache:header+bodyでmax60秒

ELBのIdle Timeout値を60秒⇒50秒にするだけで、408 Request_Timeoutは出なくなりました。

因みにELBのIdle Timeout値を60秒⇒59秒では、NGでした。

 

ELBの設定時、デフォルトのままでも、障害にはならないので、気付きにくいですね。