サイトにアクセスする際、ブラウザはバックグラウンドで何十、何百ものリクエストをサーバーに送信しています。サーバーは、読み込む必要のあるデータやファイルを配信することでリクエストに応答しますが、実際のプロセスはもっと複雑です。

サイトのパフォーマンスを向上させるには、HTTPリクエストの仕組みを理解することが欠かせません。パフォーマンスを改善する方法の中には、リクエストを最小限に抑えたり圧縮したりするものもありますが、基本的には、HTTPリクエストにより素早く応答するようにサーバーを最適化します。

今回は、HTTPリクエストについて掘り下げていきます。HTTPリクエストの概要、構造、そしてトラブルシューティングの方法などを取り上げます。

HTTPとは

HTTP(HyperText Transfer Protocolの略)とは通信プロトコルで、クライアントとサーバーの間で行われるリクエストとレスポンスの構造と言語を規定しています。クライアントは通常ウェブブラウザですが、検索エンジンロボットなど、さまざまな形態があります。

ブラウザでサイトに訪問すると、HTTPを介して接続が行われ、テキスト、画像、動画、スタイルシート、スクリプトなどのデータを受け取ることができます。

HTTPは、90年代初頭からウェブのバックボーンであり、数十年にわたり進化を遂げています。2010年代後半にはHTTP/2が開発され、クライアントがリソースを非同期ではなく同時に読み込めるようになり、パフォーマンスが大幅に改善されています。

2022年時点では、46%のウェブサイトがHTTP/2を使用しており、現在ではHTTP/3の採用もすでに議論されています。HTTP/3はUDPプロトコルで動作するため、従来のTCP接続(HTTPやHTTP/2が使用しているもの)よりも優位性があります。

HTTPリクエストとは

HTTPリクエストは、ブラウザがサーバーに接続し、特定のリソースを要求したりデータを送信したりすることを意味します。HTTPリクエストメソッドにはいくつか種類があり、種類に応じてレスポンスが大きく異なります。一般的なリクエストには、以下のようなものが挙げられます。

  1. GET:もっとも頻繁に使用されるリクエストで、サーバーに特定の情報やリソースを要求。サイトに接続すると、ページを読み込むために必要なデータを受け取るため、通常ブラウザがいくつかのGETリクエストを送信する。
  2. HEAD:読み込みたいページのヘッダー情報のみを受け取るリクエスト。GETを使ってドキュメントをダウンロードする前に、そのドキュメントのサイズを知るために使うことができる。
  3. POST:サーバーにデータを送信するためのリクエスト。例えば、サイトでお問い合わせフォームに入力して送信する場合はこのリクエストが送信される。
  4. PUT:機能的にはPOSTリクエストと似ているが、データを送信するのではなく、エンドユーザー側にすでに存在する情報を更新するために使用される。

他にも DELETE、PATCH、OPTIONSなどのようなHTTPリクエストがありますが、これらはあまり使用されません。

HTTPリクエストを送信するには、受信側のサーバーに特定の形式でメッセージを送信します。サーバーがレスポンスを返し、それに応じてクライアントがアクションを実行。リソースを読み込んだり、別のページにリダイレクトしたりなどがその一例です。

HTTPエラーは、通常サーバーがリクエストを処理できないことを意味します。その場合には、その原因を説明するエラーコードが表示されます。サーバーに接続できず、リクエストされたリソースが見つけられないというのが、HTTPエラーに最も多い原因です。

HTTPステータス&リダイレクトチェッカー(無料)を使って、ページのステータスを確認することもできます。

HTTPリクエストとレスポンスの構造

HTTPリクエストとレスポンスは、似たような構造になっています。両者を分析し、潜在的なサイトのエラーを理解するには、この構造を理解することが重要です。

一般に、HTTPリクエストは3つに分解することができます。以下、それぞれ詳しくご紹介します。

リクエストライン

HTTPリクエストは、使用するメソッドの種類とHTTPプロトコルのバージョンを示す行で始まります。例えば、GETリクエストの始まりは以下のようになります。

GET /XXX HTTP/1.1

GETの後に続く「XXX」は受け取りたいファイルを示しています。

HTTPレスポンスの始まりは、両者が使用するプロトコルのバージョンが示され、レスポンスのステータスに対応するHTTPコードも含まれます。

サイトを訪問して正常に読み込まれた場合は、成功を示す「2XX HTTP」メッセージが表示されます。

HTTP/1.1 200 OK

何らかの理由でリソースの読み込みに失敗すると、この部分にエラーコードが表示されます。例えば、サーバーがページを見つけられない場合、以下のようなレスポンスヘッダーが表示されます。

HTTP/1.1 400 OK

リクエストメソッドとHTTPステータスコードを理解していれば、クライアントとサーバーの間でどのようなトランザクションが行われているかを正確に知ることができない。このリクエストラインが、最もわかりやすい部分です。

リクエストヘッダー

リクエストのラインの後には、リクエストヘッダーが続きます。リクエストヘッダーは、トランザクションに関する追加情報を提供するもので、ホストに関する情報、エンドクライアントが使っているウェブサーバーソフトウェア、クライアントのユーザエージェントなどを指定します。

HTTPリクエストヘッダは以下のようになっています。

Host: website.com

User-Agent: Chrome/5.0 (Windows 10)

Accept-Language: en-US

Accept-Encoding: gzip, deflate

Connection: keep-alive</code.

他にも使用できるHTTPヘッダーパラメータは多数あります。各ヘッダーの意味は以下のとおりです。

  • Host:リクエスト先のサーバーのIPまたはURL
  • User-Agent:クライアントとそのオペレーティングシステム(OS)に関する情報(通常は使用しているブラウザとそのバージョンの概要)
  • Accept-language:リクエストしているファイルに複数のバージョンがある場合に備えて、クライアントが好む言語をサーバーに伝える
  • Accept-encoding:クライアントが処理できるエンコードや圧縮の種類
  • Connection:接続を維持するかタイムアウトを設定するかをサーバーに指示(リクエスト完了前に接続がタイムアウトした場合はエラーを受け取る)

リクエストラインと続けて見ると、以下のような構造になります。

GET /XXX HTTP/1.1

Host: website.com

User-Agent: Chrome/5.0 (Windows 10)

Accept-Language: en-US

Accept-Encoding: gzip, deflate

Connection: keep-alive</code.

上は、特定のリソースのためにwebsite.comホストにGETリクエストを送信する例です。レスポンスヘッダーは以下のようになります。

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2022 12:28:53 GMT

Server: Apache/2.2.14 (Win32)

Last-Modified: Wed, 22 Jul 2022 19:15:56 GMT

Content-Length: 88

Content-Type: text/html

Connection: Closed</code.

レスポンスヘッダーは2行目からで、接続の日付、ホストが使用しているウェブサーバーとOSの情報が含まれます。ファイルをリクエストしている場合、ヘッダーには最終更新日、ファイルの長さ、扱っているコンテンツの種類などの情報も表示されます。最後の行は、リクエストが完了し接続が終了されたことを示しています。

ヘッダー内の情報とパラメータは、リクエストの種類によって変わりますが、全体の構造は変わりません。

メッセージボディ

メッセージボディは、HTTPリクエストの最もシンプルな部分で、使用するメソッドに応じて、送信または受信するデータが含まれます。

例えば、GETメソッドでHTMLファイルをリクエストすると、次のような構造のレスポンスを受け取ります。

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2022 12:28:53 GMT

Server: Apache/2.2.14 (Win32)

Last-Modified: Wed, 22 Jul 2022 19:15:56 GMT

Content-Length: 88

Content-Type: text/html

Connection: Closed

<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML 2.0//EN”></code.

HTTPリクエストやレスポンスのボディは、1行の空行を使ってヘッダーから分離されます。また、わかりやすいよう、上の例ではHTMLファイルは含めていません。

HTTPリクエストの監視とトラブルシューティング

サイトのHTTPリクエストを監視する方法はいくつかあり、アプリケーションパフォーマンス管理(APM)ツールを使うと、PHPタスク、HTTPエラー、データベースリクエストなど、ウェブサイトのトランザクションを監視することができます。

Kinstaのお客様は、MyKinsta組み込みのAPMツールを使用することができます。KinstaのAPMは、サイトが受信している外部HTTPリクエストの種類をチェックし、それらのステータスを監視します。

MyKinstaのAPMツール
MyKinstaのAPMツール

繰り返し発生するHTTPエラーを監視することができるため、サイトのトラブルシューティングにも役立ちます。サイト内でHTTPステータスエラーが表示されたら、MyKinstaのAPMツールを有効にしてエラーを再現し、リクエストの詳細を確認可能です。

また、DDoS攻撃の検出にも役立ち、不自然な大量のHTTPリクエストを素早く見つけることができます。DDoS攻撃かトラフィックの急増かを判断し、必要な対処を取りましょう。

まとめ

HTTPリクエストの概要と仕組みを理解することは、サイトのトラブルシューティングに役立ちます。HTTPエラーの発生は、クライアントが行ったリクエストをサーバーが処理できなかったことを意味します。リクエストが何であったかを知り、HTTPレスポンスのエラーコードを理解すれば、問題を解決するのに十分な情報を得ることができます。

HTTPリクエストを理解するためには、メソッドの種類、HTTPリクエストとレスポンスの構造、そしてさまざまなHTTPステータスコードの意味を知る必要があります。

Kinstaのアプリケーションホスティングデータベースホスティング、およびWordPress専用マネージドホスティングでは、サイトのHTTPリクエストを自動監視するAPMを追加料金なしでご利用いただけます。

ご興味がありましたら、ぜひKinstaのホスティングサービスをお試しください。