SpringBootにkeepaliveのtimeout設定をする
AWS の環境で ELB(ALB)のアイドルタイムアウトの設定を変更する際、意識しておかなければいけなのがバックエンド側の KeepAlive やタイムアウト設定です。
For backend connections, we recommend that you enable the HTTP keep-alive option for your EC2 instances. You can enable HTTP keep-alive in the web server settings for your EC2 instances. If you enable HTTP keep-alive, the load balancer can reuse backend connections until the keep-alive timeout expires.
バックエンド接続では EC2 インスタンスで HTTP キープアライブオプションを有効にすることが推奨されます。EC2 インスタンスのウェブサーバー設定で HTTP キープアライブを有効にできます。HTTP キープアライブを有効にすると、ロードバランサーはキープアライブのタイムアウト期間が終了するまで、バックエンド接続を再利用できます。
Connection idle timeout
バックエンド側が Apache や Nginx のケースはこれまでに何度も経験してきましたが、SpringBoot(Tomcat)の場合はどうすればいいでしょうか。
今回はその辺を探っていきたいと思います。
デフォルトのKeepAliveTimeout
まず、何も特別な設定をしない場合の「KeepAlive Timeout」の値が何になっているのか確認します。
actuator を設定して env や configprops を確認しても、こちらが意図的に指定した内容しか確認できなかったので、起動後にプログラムから確認します。
下記の公式ドキュメントを参考に、「keepAliveTimeout」と「connectionTimeout」の設定値を確認します。
server.tomcat.keep-alive-timeout
server.tomcat.connection-timeout
っと何気なく書きましたが、サクッと Kotlin でサンプルを作ってみましょう。
これで確認する限り、デフォルトは 60 秒(60000ms)のようです。
override fun customize(factory: TomcatServletWebServerFactory) {
factory.addConnectorCustomizers(TomcatConnectorCustomizer { connector ->
val protocol = connector.getProtocolHandler() as AbstractHttp11Protocol<*>
// protocol.keepAliveTimeout
// protocol.connectionTimeout
})
}
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 秒となります。
server.connection-timeout: 120000