Elastic Load Balancing (ELB) のバックエンドサーバーとして、Apache または NGINX を実行する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用したいです。パフォーマンスを最大化できる設定を把握したいです。
解決策
パフォーマンスを最大化するには、バックエンドアプリケーションの応答時間とクライアントの要件を分析します。
クライアントヘッダーのタイムアウト
バックエンドサーバーが接続を閉じたものの、ロードバランサーに通知を行わなかった場合、Application Load Balancer で 502 エラーが発生する場合があります。Classic Load Balancer では HTTP 504 エラーが発生します。
アイドル接続を防ぐには、アプリケーションのタイムアウトをアイドルタイムアウト値よりも大きい値に設定します。Apache でアプリケーションタイムアウトを設定する方法については、Apache のウェブサイトで「TimeOut ディレクティブ」を参照してください。NGINX については、NGINX のウェブサイトで client_header_timeout を参照してください。
Keepalive
CPU 使用率を軽減し、応答時間を改善するには、keepalive を有効にします。keepalive を有効にすると、ロードバランサーは HTTP リクエストごとに新しい TCP 接続を確立しなくなります。
Apache で keepalive を有効にする方法については、Apache のウェブサイトので「KeepAlive ディレクティブ」を参照してください。NGINX で keepalive を有効にするには、keepalive_disable を none に設定します。詳細については、NGINXの ウェブサイトで「keepalive_disable」を参照してください。
keepalive オプションを有効化する際は、ロードバランサーのアイドルタイムアウトよりも長い keepalive タイムアウトを選択してください。Apache でタイムアウトを設定する方法については、Apache のウェブサイトで「KeepAliveTimeout ディレクティブ」を参照してください。NGINX については、NGINX のウェブサイトで keepalive_timeout を参照してください。
読み取りタイムアウト
アプリケーションの応答時間に合わせて読み取りタイムアウトを設定します。ロードバランサーは、リクエストのヘッダーと本文の両方を受信するのに十分な間、接続を開いておく必要があります。
注: ロードバランサーのアイドルタイムアウト値がバックエンドのタイムアウトよりも小さいことを確認してください。
Apache でリクエストの読み取りタイムアウトを設定する方法については、「RequestReadTimeout ディレクティブ」を参照してください。NGINX でクライアントヘッダーのタイムアウトを設定する方法については、NGINX のウェブサイトで client_header_timeout を参照してください。NGINX でのクライアント本文のタイムアウトについては、NGINX のウェブサイトで「client_body_timeout」を参照してください。
keepalive リクエストの最大数
keepalive を有効化する際、1 つの TCP 接続で処理されるリクエストの数を 100 以上に設定します。Apache でリクエスト数を設定する方法については、Apache のウェブサイトで「MaxKeepAliveRequests ディレクティブ」を参照してください。NGINX については、NGINX のウェブサイトで keepalive_requests を参照してください。
AcceptFilter
デフォルトでは、AcceptFilter は有効になっています。AcceptFilter は Apache に対し、接続に TCP_DEFER_ACCEPT オプションを使用するように指示します。その結果、TCP ソケットがハーフオープン状態のままになる可能性があります。TCP ソケットがハーフオープン状態に留まっている場合、ロードバランサーは接続が確立されたと見なしますが、バックエンドインスタンスでは接続を完全に確立されません。ハーフオープン接続は、使用前に接続がアイドル状態になる低容量のロードバランサーでは発生する可能性が上がります。
Apache で AcceptFilter を設定する方法については、Apache のウェブサイトで 「AcceptFilter ディレクティブ」を参照してください。NGINX については、NGINX のウェブサイトで listen を参照してください。
ログ記録
%{X-Forwarded-For}i オプションを有効化し、Apache で各リクエストのログに ELB x-forwarded-for ヘッダーを表示させるには、次のコマンドを実行します。
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
ELB x-forwarded-for ヘッダーには、元のクライアントの IP アドレスが含まれています。%D オプションを指定すると、各リクエストを完了する所用時間がアクセスログに追加されます。
Apache MPM
Apache イベントのマルチプロセッシングモジュール (MPM) により、ロードバランサーからの接続が途中で終了し、Application Load Balancer で HTTP 502 エラーが発生する場合があります。Classic Load Balancer では HTTP 504 エラーが発生します。
代わりにワーカー MPM を使用することをおすすめします。
注: 設定を更新した後、Apache または NGINX を再起動します。
関連情報
Classic Load Balancer の登録済みインスタンス
Classic Load Balancer を設定する