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)は完了です。