Apacheの性能対策設定 (TimeOut / KeepAlive)を説明します。
本記事のパラメータをチューニングすることで、不要なTCPコネクションがサーバに滞留することを防止できます。
前提条件
- 作業は、root権限を持つユーザで実施します。
- OSおよびApacheは、以下のバージョンで検証しています。
# cat /etc/redhat-release
CentOS Linux release 8.3.2011
# uname -r
4.18.0-240.el8.x86_64
# httpd -v
Server version: Apache/2.4.37 (centos)
Server built: Nov 4 2020 03:20:37
設定手順 (httpd.conf)
viなどのテキストエディタで、Apacheの設定ファイルを編集します。
# vi /etc/httpd/conf/httpd.conf
TimeOut
TimeOut
は、以下処理のタイムアウト値です。デフォルト値は60秒です。
- クライアントからのHTTPリクエスト受信時のTCPパケット受信待機時間
- クライアントへのHTTPレスポンス送信時のTCPパケット送信(相手からACKを受信するまでの)待機時間
- モジュール(mod_xxx)の処理待機時間
WebサーバとAPサーバが連携するWebアプリケーションシステムでは、APの処理が遅延するとWebサーバがHTTPレスポンスをクライアントに送信する時間も遅延してしまいます。こうしたケースでは、TimeOut
の時間を短くすることで、異常時にTCPコネクションがWebサーバに滞留することを防止できます。
TimeOut
のデフォルト値(60秒)変更する場合、ファイルの末尾にパラメータを追加します。以下はアイムアウト30秒を指定する例です。
TimeOut 30
KeepAlive
KeepAlive
を使用することで、1つのTCPコネクションを使用して複数のHTTPリクエストを処理することができます。複数の画像ファイルやCSSファイルを同時に読み込むWebページを配信するWebサーバでは、KeepAlive
を使用することでApacheの性能が向上します。
KeepAlive
はデフォルトでOn
になっていますが、ファイル内には明示的な記載がありません。ファイルの末尾に、KeepAlive
に関する設定を追加します。
TCPコネクション維持中に一度に処理できる最大リクエスト数を示すMaxKeepAliveRequests
は、一般的に100程度を指定しておけば不足することはありません。
TCPコネクションを維持する最長時間(秒)を示すKeepAliveTimeout
は、TCPコネクションを維持し続ける時間を指定します。この期間は、1つのTCPコネクションで複数のHTTP通信が行えます。一般的には数秒程度を指定します。
サーバがHTTPリクエスト受け付けると、KeepAliveTimeout
の期間TCPコネクションが保持され続けます。大きな値を指定すると、大量のクライアントから同時接続があった際にTCPコネクションが不足する恐れがあるので注意が必要です。
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3
Webサーバに同時接続するクライアント数が多く、1クライアントあたりのHTTPリクエスト数が少ない場合は、TCPコネクションの滞留を防止するためにKeepAliveをOffにします。これにより、サーバはHTTPレスポンスを返却後すぐにコネクションを切断するので、リソースを節約することができます。
KeepAlive Off
設定内容の確認
以下のコマンドを実行し、設定ファイルの文法に問題がないか確認します。
文法が正しければ、Syntax OK
が表示されます。
# apachectl configtest
Syntax OK
設定の反映
以下のコマンドを実行し、httpdサービスを再起動して設定を反映します。
# systemctl restart httpd.service
以下のコマンドを実行し、httpdサービスが起動状態であることを確認します。
Active:の列にactive (running)が表示されていれば、サービスは起動中です。
# systemctl status --no-pager httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2019-11-26 13:35:13 JST; 20s ago
(略)
以上で、Apacheのパフォーマンスチューニング (TimeOut / KeepAlive)は完了です。