Webサーバ

SpringBoot2.1のTomcatにkeepaliveのtimeout設定をする

AWS の環境で ELB(ALB)のアイドルタイムアウトの設定を変更する際、意識しておかなければいけなのがバックエンド側の KeepAlive やタイムアウト設定です。

バックエンド接続では EC2 インスタンスに HTTP キープアライブオプションを有効にすることが推奨されます。EC2 インスタンスのウェブサーバー設定で HTTP キープアライブを有効にできます。HTTP キープアライブを有効にすると、ロードバランサーはキープアライブのタイムアウト期間が終了するまで、バックエンド接続を再利用できます。また、アプリケーションのアイドルタイムアウトは、ロードバランサーに設定されたアイドルタイムアウトよりも大きな値に設定することをお勧めします。

Application Load Balancer

バックエンド側が Apache や Nginx のケースはこれまでに何度も経験してきましたが、Tomcat(SpringBoot)の場合はどうすればいいでしょうか。

今回はその辺を探っていきたいと思います。

デフォルトのKeepAliveTimeout

まず、何も特別な設定をしない場合の「KeepAlive Timeout」の値が何になっているのか確認します。

actuator を設定して env や configprops を確認しても、こちらが意図的に指定した内容しか確認できなかったので、起動後にプログラムから確認します。

下記のサイトのサンプルを参考に、keepAliveTimeout と connectionTimeout の設定値を確認します。

っと何気なく書きましたが、実は隣の席の人にサクッと Kotlin でサンプルを作ってもらいました(笑)

これで確認する限り、デフォルトは 60 秒(60000ms)のようです。

keepAliveTimeoutの設定

公式のドキュメントには、keepAliveTimeout の設定を上書きする項目はないようですが、connectionTimeout の値と同じにしてくれるようです。

server.connection-timeout= # Time that connectors wait for another HTTP request before closing the connection. When not set, the connector’s container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout.

Common application properties

よって、application.yaml で設定をします。120 秒にしたい場合はこんな感じ。

これで、keepAliveTimeout も connectionTimeout も 120 秒となります。