今回はCDNを利用する上で避けては通れない、HTTPヘッダの重要性についてご紹介します。
一般的なCDNはオリジンサーバー側のHTTPヘッダをみてキャッシュ時間を決める等、様々な判定を行う為CDNを利用する上でHTTPヘッダとオトモダチになっておくことは大変重要です。
HTTPヘッダって?
WEBサイトを表示する時、http:// もしくはhttps:// から始まっていますが、「http」とは通信プロトコルの一つでWebサーバーとクライアント(ブラウザなど)が、相互に通信するためのお約束ごとです。
Aさんがhttp://www.google.co.jpにアクセスすると、GoogleさんのWEBサーバーがコンテンツを返却し、AさんのブラウザにGoogleのサイトが表示されます。
「このコンテンツみたいです(リクエスト)」 → 「はい。どうぞ!(レスポンス)」
というやりとりがHTTPという決まり事に従ってやりとりされているわけです。その中でどういった情報をリクエストして、どのようなコンテンツを返すのかを定義する文字列がHTTPヘッダです。
HTTPヘッダにはリクエストヘッダとレスポンスヘッダの2種類が存在します。
HTTPヘッダの種類(リクエストヘッダ)
HTTPリクエストヘッダは「コンテンツがみたい!」「WEBみたい!」 という情報をサーバーに送る為の情報です。そのため、HTTPリクエストヘッダを作成するのはアクセス元のブラウザやアプリ本体ということになります。
WEBサーバーは、受け取ったHTTPリクエストヘッダの内容からどんな情報をブラウザやアプリに返すかを判断します。
アクセス元が生成するわけですから当然、ChromeやIE,Firefox、Safariなどブラウザによって若干生成する値は異なりますが基本的なリクエストヘッダは以下の3つのパートがあります。
HTTPリクエスト行
HTTPリクエスト行には、「メソッド」 「URL」 「HTTPバージョン」の3つの情報が含まれています。
メソッド
GETやPOSTなどの情報をメソッドといいます。WEBを閲覧する時は、ほぼGETリクエストですのでインターネット上の多くはGETリクエストが飛び交っていることになります。しかし、WEBフォームから問い合わせを行う場合はPOSTが利用されますし、WEBAPIを呼び出す場合もPOSTが使われる場合があります。
URL
WEBサイトのURLやパスが入ります。
HTTPバージョン
こちらは初めにご案内したHTTPプロトコルのバージョンです。現在主流はHTTP1.1ですが今後次世代プロトコルHTTP2.0という物に置き換わってくるであろうと言われています。
HTTP2.0ではHTTP1.1より効率が良い通信が出来るように、HTTPヘッダや通信の仕組みそのものが見直されているのですが今回は割愛させて頂きます。
データ本体
ブラウザから何かしらデータをサーバーに送る際、そのデータの内容がこちらに格納されます。
すなわちGETなどのメソッドでは空の状態となります。
HTTPリクエストヘッダ
ようやくHTTPヘッダのお話です。HTTPヘッダは主に以下のような情報が入ります。
フィールド名 | 内容 |
Authorization | ユーザ認証用データ。サーバからのWWW-Authenticateヘッダに応える |
From | 要求送信元のメールアドレス |
If-Modified-Since | ここに指定された日付以降に更新された情報のみを要求 |
Referer | 現在のページを取得するときにユーザが使った リンクを含むページのURL |
User-Agent | ブラウザのタイプ、ブラウザ固有のコンテンツを返すときに有用 |
Accept | そのブラウザが欲しいMIMEのタイプ |
Accept-Charset | そのブラウザが期待する文字セット |
Accept-Encoding | そのブラウザがデコードできるデータのエンコーディング。 大きなファイルのダウンロードに有効 |
Accept-Language | そのブラウザが予期している言語。 サーバが多国語に対応しているときなどに使う |
Host | もとのURLにリストされているホストとポート |
If-Match | 指定した ETag にマッチする場合にのみ、メソッドを実行することを サーバに依頼します。 |
If-None-Match | 指定した ETag にマッチしない場合にのみ、メソッドを実行することを サーバに依頼します。 |
If-Range | 情報が更新されていないときはRangeで指定した範囲の情報を、 そうでなければ全体を要求 |
If-Unmodified-Since | 指定された日時以降更新されていなかったときに応答を返す |
Max-Forwards | TRACEメソッドとともに使う。経由するポートの最大数指定 |
Proxy-Authorization | Proxy-Authenticateに対応して、プロキシにユーザ認証情報を通知 |
Range | データの一部を要求する |
HTTPリクエストヘッダだけでも結構種類がありますね。
HTTPヘッダの種類(レスポンスヘッダ)
レスポンスヘッダとは、ブラウザやアプリから送られてきたリクエストヘッダをサーバー側が受信した後、サーバー側でレスポンスヘッダを作成しブラウザやアプリに送ります。送られてきたレスポンスヘッダをクライアントが受信して、初めてWEBコンテンツを表示することが出来ます。
レスポンスヘッダには「レスポンス状態コード」「HTTPヘッダ」「データ本体」の3つのパートがあります。
レスポンス状態コード
こちらは、リクエストに対する返答の状態を番号で表した物が入ります。「状態コード」(「HTTPステータスコード」で一般的なのは404 NotFound などでしょうか。 こちらはコンテンツがサーバーにありませんというHTTPステータスコードです。
HTTPステータスコードはHTTPヘッダと同様に複数にグループに分かれ、非常に多くのコードがあります。
ステータスコードは大まかに分けて5つです。
- 100番台 : 処理中
- 200番台 : 成功
- 300番台 : リダイレクト
- 400番台 : クライアントエラー
- 500番台 : サーバエラー
100番台
100番台はクライアントからのリクエストを処理中であることを示すステータスとなります。
Webサーバー側からクライアント側(ブラウザなど)に対して少しレスポンスに時間がかかることや、詳細な情報をリクエストしてほしい等のレスポンスを返している際に利用します。100番台のステータスコードはあまり利用されることはありません。
200番台
200番台はクライアントからのリクエストが受付に成功したというステータスです。つまりサーバー側ではエラーもなくコンテンツをクライアントに返すことが出来る状態というコードです。多くのCDNでは200番台のステータスコードは普通にファイルをキャッシュします。
300番台
300番台は簡単にいうと「リダイレクト」ですが、実際はブラウザ側で追加の処理を実行する必要があるということを通知する時のステータスコードです。CDN側では200番台と同様キャッシュして配信します。
400番台・500番台
400番台 500番台のステータスコードはエラーコードです。サーバー側でリクエストされたものが返せない状態のときに使用されます。400番台はクライアント側に原因があるエラーとなり、一方500番台はWebサーバ側が原因のエラーです。
CDNではこのようなエラーコードはネガティブレスポンスといい、デフォルトで数分間キャッシュする場合があります。ネガティブレスポンスをキャッシュするメリットとしては大量の不要なエラーアクセスをオリジンサーバー側に到達させないという目的があり、弊社のCDNもデフォルトで最大5分間ネガティブレスポンスをキャッシュします。
このように、弊社のCDNではステータスコードによってなるべくオリジンサーバーにリクエストを行わないよう、CDNキャッシュサーバー側で出来る処理は全力で行っています。
HTTPレスポンスヘッダ
ようやく、HTTPヘッダのお話です。
HTTPヘッダはデータ本体の前に送られてくる、各種の状態を示す情報が入れられている部分です。HTTPレスポンスヘッダは以下のような種類があります
フィールド名 | 内容 |
---|---|
Server | ウェブサーバの名前とバージョン情報。 |
Date | 現在の日付(グリニッジ標準時) |
Last-Modified | リソースの更新日 |
Content-Length | 出力のバイト単位の長さ バイナリデータも含みます。 |
Content-Type | 出力のMIMEタイプ |
Expires | リソースの有効期限 この日付以降は無効です。キャッシュは破棄されます。 |
Location | リダイレクト URL 情報 Location で指定されたリソースが送信されます。 単独ヘッダとして出力されます。 |
Pragma | リソースのキャッシングを有効/無効にする 「Pragma: no-cache」と指定すると、リソースのキャッシュを無効にします。 |
Status | リクエストのステータス 単独ヘッダとして出力されます。 |
WWW-Authenticate | 認証データ。 認証に必要なユーザー名やパスワードなどの情報が含まれます。 |
Refresh | 指定されたドキュメントを再ロードする。 |
Set-Cookie | データをクライアント側に保存する。 |
Etag | サーバー固有の情報が付与され、ブラウザキャッシュを再利用するかどうか判断させます。 |
リクエストヘッダと同じくそこそこ種類がありますね。
データ本体
データ本体にはHTMLや画像、動画などの実際表示するコンテンツ自身が入ってます。
ブラウザは、データ本体の前に先ほどの「レスポンス状態コード」と「HTTPヘッダ」を受け取っていますが、画面には表示しないため意識することは出来ないです。
まとめ
今回はCDNを運用していく上で重要となるHTTPヘッダのお話をしていみました。CDNではHTTPヘッダ部分もキャッシュするため、ユーザーエージェントやその他情報が毎回異なるだけで、別のキャッシュと認識してしまいます。
そうなると、毎回オリジンサーバーにコンテンツを取りに行ってしまいキャッシュヒット率が低下しCDNを利用している意味が無くなってしまいますね。
そのため、オリジンサーバー側では不要なヘッダは出力せず、本当に付与しなければいけないヘッダのみに限定することがCDNを利用する上でまず初めにできるチューニングです。