HTTP/2 サーバ プッシュを使用すると、サーバは、クライアントが各リソースを明示的に要求しなくても、1 つのクライアント要求に応答して複数のリソースを送信できます。つまり、クライアントがリソースを要求したときに依存リソースを先制して送信できます。これにより、各要求がリソースを提供するのを待機することによって発生する可能性のある遅延が短縮されます。
たとえば、index.html、style.css、favicon.ico などの 3 つのリソースがある Web サイトを考えてみましょう。あるユーザーがブラウザを使用してこの Web サイトのホーム ページに接続し、index.html を取得するとします。ブラウザは index.html を受信すると、style.css と favicon.ico が必要であることを発見します。その後、ブラウザは他の 2 つのファイルを取得するための要求を発行します。したがって、この Web ページを組み立てるために、ブラウザはネットワークの往復を積み重ねながら、徐々にサイトの構成を把握します。
HTTP/2 PUSH を使用すると、サーバは、特定の時点でプッシュをトリガするいくつかのルールを設けることで主導権を握ることができます。たとえば、サーバは index.html への要求を受信すると、ブラウザからのそれぞれの要求を待機せずに、style.css と favicon.ico をプッシュできます。正常に実行されると、ブラウザが index.html の解析を終了するまでに、styles.css と script.js の転送はすでにプッシュ モードで開始されています。
LINK
ヘッダー
事前ロード リンク要素を使用して、特定の Web ページに必要な外部リソースをクライアントに指定できます。サーバは、タイプが事前ロードに設定された Link ヘッダーを送信することもできます。クライアントは、最初に要求されたページを処理する前に、このヘッダーを使用してリソースを要求します。
リンク:</style.css>; rel=preload; as=style
サーバ プッシュが有効になっている場合、NSX Advanced Load Balancer はこれらの Link ヘッダーを傍受して PUSH_PROMISE フレームを作成し、クライアントが要求しなくてもリソースをフェッチできます。サーバは、nopush ターゲット属性を使用して、プッシュされないように特定の事前ロード リンク要素を指定することもできます。
リンク:</styles.css>; rel=preload; as=style; nopush
PUSH_PROMISE
フレーム
サーバはこのフレームをブラウザに送信して、リソースのプッシュを開始します。すべてのサーバ プッシュ ストリームは、PUSH_PROMISE フレームを通じて開始されます。エンティティが PUSH_PROMISE フレームを送信すると、プッシュされたリソースを要求する応答データが提供される必要があるクライアントに記述されたリソースをプッシュする目的が伝えられます。
サーバから送信された PUSH_PROMISE フレームはサポートされていません。しかし、サーバ プッシュが有効になっている場合、NSX Advanced Load Balancer はサーバから Link ヘッダーを受信すると、PUSH_PROMISE フレームをクライアントに送信します。
NSX Advanced Load Balancer による HTTP/2 サーバ プッシュの動作
次の図は、NSX Advanced Load Balancer によるサーバ プッシュの動作を示しています。
クライアントは、/index.html にアクセスするための要求を NSX Advanced Load Balancer に送信します。NSX Advanced Load Balancer は、バックエンド サーバに要求を送信します。
バックエンド サーバが NSX Advanced Load Balancer に応答すると、その応答を傍受し、Link ヘッダーが存在するかどうかを確認します。Link ヘッダーが存在し、事前ロードが設定されている場合、NSX Advanced Load Balancer はサーバから受信した応答とともに PUSH_PROMISE フレームをクライアントに送信します。上の図の PUSH_PROMISE フレームに注目してください。
PUSH_PROMISE フレームをクライアントに送信した後、NSX Advanced Load Balancer は GET 要求を送信してリソースを先制してフェッチします。
NSX Advanced Load Balancer はサーバから応答を受信すると、クライアントにその応答を返します。
サーバ プッシュは、バックエンド接続が HTTP/1.1 の場合でも機能します。
HTTP/2 サーバ プッシュの構成
次のコマンドを使用して、サーバ プッシュを有効にします。
[admin:ctrl]: > configure applicationprofile System-HTTP [admin:ctrl]: applicationprofile> http_profile [admin:ctrl]: applicationprofile:http_profile> http2_profile [admin:ctrl]: applicationprofile:http_profile:http2_profile> enable_http2_server_push Overwriting the previously entered value for enable_http2_server_push [admin:ctrl]: applicationprofile:http_profile:http2_profile> save [admin:ctrl]: applicationprofile:http_profile> save [admin:ctrl]: applicationprofile> save
HTTP/2 サーバ プッシュが有効になっている場合は、先制してフェッチする必要があるリソースの数を定義できます。この機能により、クライアントが過負荷状態にならないように、要求の数を制限できます。クライアント側の HTTP/2 接続を介した同時プッシュ要求の最大数を定義するには、次の手順を実行します。
[admin:ctrl]: > configure applicationprofile System-HTTP [admin:ctrl]: applicationprofile> http_profile [admin:ctrl]: applicationprofile:http_profile> http2_profile [admin:ctrl]: applicationprofile:http_profile:http2_profile> max_http2_concurrent_pushes_per_connection 16 Overwriting the previously entered value for max_http2_concurrent_pushes_per_connection [admin:ctrl]: applicationprofile:http_profile:http2_profile> save [admin:ctrl]: applicationprofile:http_profile> save [admin:ctrl]: applicationprofile> save
アプリケーション プロファイル設定には、他のフィールド max_http2_control_frames_per_connection
と max_http2_concurrent_streams_per_connection
もあります。値が max_http2_concurrent_pushes_per_connection
よりも小さい場合、これらの値を使用してプッシュ ストリーム(リソース)の数を制限します。
選択的なサーバ プッシュ
サーバ プッシュは Link ヘッダーを傍受することによって機能するため、HTTP ポリシーまたは DataScript を使用して応答に Link ヘッダーを追加できます。このようにして、指定された一致基準で満たされた条件に基づいて、特定のリソースを選択的にプッシュする方法を実現できます。
サンプルの HTTP 応答ポリシーは次のとおりです。
HTTP/2 サーバ プッシュと NSX Advanced Load Balancer のキャッシュ
NSX Advanced Load Balancer が新しい要求をバックエンド サーバに送信するのではなく、キャッシュから一部のリソースをフェッチする必要がある場合は、NSX Advanced Load Balancer のキャッシュを利用できます。
HTTP キャッシュを利用して、サーバ応答とプッシュされたリソースを保存できます。フェッチされたリソースは、PUSH_PROMISE
フレームの送信後にトリガされるサーバ応答でもあるため、HTTP キャッシュに個別のキャッシュ オブジェクトとして保存されます。NSX Advanced Load Balancer キャッシュが有効になっている場合の要求フローは次のとおりです。
可視化とトラブルシューティング
アプリケーション ログ:
ヘッダー:
HTTP 統計情報
admin:ctrl]: > show virtualservice vs_v2_to_v1 httpstats +---------------------------------+---------------------------------+ | Field | Value | +---------------------------------+---------------------------------+ | connections_handled | 16 | | requests_handled | 48 | | response_2xx | 44 | | response_3xx | 0 | | response_4xx | 2 | | response_5xx | 2 | | cache_hits | 12 | | cache_bytes | 184451 | | http2_requests_handled | 48 | | http2_response_2xx | 42 | | http2_response_3xx | 0 | | http2_response_4xx | 2 | | http2_response_5xx | 2 | | http2_protocol_errors | 0 | | http2_flow_control_errors | 0 | | http2_frame_size_errors | 0 | | http2_compression_errors | 0 | | http2_refused_stream_errors | 0 | | http2_enhance_your_calm | 0 | | http2_miscellaneous_errors | 0 | | http2_trailers_received | 0 | | http2_control_frame_flood_errors| 2 | | http2_queued_frames_flood_errors| 0 | | http2_empty_frame_flood_errors | 0 | | open_requests | 0 | | req_body_buffered_reqs | 0 | | resp_body_buffered_reqs | 0 | | invalid_httpv1_requests | 0 | | invalid_httpv2_requests | 0 | | dropped_requests | 0 | | server_push_requests_handled | 32 | | server_push_response_2xx | 28 | | server_push_response_3xx | 0 | | server_push_response_4xx | 2 | | server_push_response_5xx | 2 | +---------------------------------+---------------------------------+