HTTP/2 とは何か、Nginx でそれを有効にする方法
Web を支えるコア テクノロジーの 1 つは HTTP です。残念ながら、HTTP/1.1 は静的 HTML サイト用に設計されており、最後に更新されたのは 1999 年頃でした。今日の Web は大きく変化しました。 Web サイトはますます動的になり、多くのリソースが含まれています。このチュートリアルでは、SPDY と HTTP/2 とは何か、そして Nginx でそれらを有効にする方法について説明します。
更新: SPDY は非推奨になりました。 Nginx で有効にする必要はありません。代わりに、HTTP/2 を使用する必要があります。
スパイディ
2009 年に Google は SPDY (スピーディーと発音) と呼ばれる新しいプロトコルを導入しました。 SPDY は、HTTP/1.1 に対して 3 つの重要な改良点を提供します。
1. ヘッダー圧縮
すべての HTTP リクエストとレスポンスには、ヘッダーにかなりの量のデータが含まれています。ヘッダーには多くの反復的なメタデータ (ユーザー エージェントと Cookie) が含まれています。 HTTP/1.1 は実際のコンテンツのみを圧縮でき、ヘッダーは圧縮できません。 SPDY はヘッダー サイズを大幅に縮小します。 SPDY は、反復的な単一接続ごとにヘッダーを送信するのではなく、接続全体に対してヘッダーを 1 回送信することをサポートしています。
2.並行リクエスト
HTTP はメッセージベースのプロトコルです。 TCP 接続を確立し、HTTP リクエストを送信したら、次のリクエストを送信する前に、応答が到着するまで待機する必要があります。このような各リクエストには、ブラウザとサーバーの間で少なくとも 1 往復が必要で、これには数百ミリ秒かかる場合があります。これは大幅な遅れです。応答の 1 つが遅かった場合、他のすべての要求が遅れます。これを行頭ブロックといいます。複数の同時接続を開いて複数のリクエストを同時に送信できますが、最新のブラウザでは通常、ホストあたりの同時接続数が 4 ~ 8 に制限されています。
HTTP では、要求メッセージと応答メッセージの間の関係は暗黙的です。サーバーは、私がそのリクエストに対する応答であることを明示的に示しません。応答はそのリクエストの後に順番に続くため、それがリクエストの応答であることだけを識別できます。
SPDY は真の多重化を提供します。 SPDY を使用すると、1 つの接続で好きなだけリクエストを送信し、任意の順序で応答を取得できます。そのため、ブラウザーは複数のリクエストを送信するためにホスト名ごとに複数の接続を開く必要がありません。 SPDY を使用すると、ホスト名ごとに 1 つの接続を開くことができます。接続が減るとサーバー上で開かれるソケットも減るため、これによりサーバーの負荷も軽減されます。
3. サーバープッシュとサーバーヒント
HTTP では、ブラウザとサーバー間のすべての通信はブラウザによって開始されます。サーバーが何か伝えたいことがある場合、サーバーは実際にはブラウザーが情報を要求するまで待つ必要があります。ブラウザーが HTML をリクエストすると、サーバーは、ページを完全にレンダリングするためにブラウザーが取得する必要がある関連する CSS、JavaScript、または画像が必要であることを認識します。しかし HTTP では、サーバーはブラウザが CSS、JavaScript、画像をリクエストするまで待たなければなりません。
SPDY を使用すると、サーバーは、ブラウザーがデータを要求しなくても、プロアクティブにデータをプッシュできます。
場合によっては、サーバープッシュが無駄になる可能性があります。たとえば、ブラウザのキャッシュに CSS ファイルがすでに存在しており、それを再度ダウンロードしない可能性があります。 SPDY には、サーバー ヒントと呼ばれるサーバー プッシュのライト バージョンがありました。これは、サーバーがブラウザーに提案を提供するだけで、リクエストは依然としてクライアントによって行われることを意味します。
SPDY では、次の Web パフォーマンスのベスト プラクティスが不要になり、開発者の作業負荷が大幅に軽減されます。
- CSSスプライト
- インライン画像
- 並列リクエストを改善するためのシャーディング。
- CSS/JavaScriptの連結
制限事項
SPDY は優れていますが、まだいくつかの制限があります。
- 1 つ目は、HTTPS に制限されることです。
- SPDY は各ホストと個別に通信します。ブラウザーは、Web ページを完全にレンダリングするために複数のホストと通信する必要がある場合があります。すべてが SPDY をサポートしている場合でも、ブラウザはホストごとに 1 つの接続を開く必要があります。多重化はホストごとにのみ実行できます。
Nginx で SPDY を有効にする方法
前に述べたように、SPDY を使用する前に HTTPS を有効にする必要があります。 Let’s Encrypt から無料の SSL/TLS 証明書を簡単に取得できます。 HTTPS をまだ有効にしていない場合は、次のチュートリアルを使用して無料の SSL/TLS 証明書を取得してください。
- Ubuntu で Let's Encrypt を使用して Nginx で HTTPS を適切に有効にする
HTTPS を有効にしている場合は、Nginx が SPDY モジュールでコンパイルされているかどうかを確認してください
sudo nginx -V
次のテキストが表示される場合は、SPDY モジュールが Nginx インストールに含まれています。
--with-http_spdy_module
サーバーブロックファイルを設定する
sudo vi /etc/nginx/conf.d/yourdomain.conf
または
sudo vi /etc/nginx/sites-available/yourdomain.conf
サーバーセクションで、 listen 443 ssl の後にspdyを追加します。
server {
listen 443 ssl spdy;
server_name www.linux-terminal.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
......
次に、ファイルを保存して閉じます。 Nginx 設定をリロードします。
sudo service nginx reload
または
sudo systemctl reload nginx
これで完了です。非常に簡単!
Nginx 1.9.5 以降、ngx_http_spdy_module は ngx_http_v2_module に置き換えられました。したがって、1.9.5 以降のバージョンを使用している場合は、SPDY を有効にする必要はありません。 HTTP/2 とそれを Nginx で有効にする方法については、次のテキストを参照してください。
HTTP/2
HTTP/2 は SPDY に基づいています。 HTTP/2 仕様は、2015 年 5 月に RFC 7540 として公開されました。HTTP/2 のセマンティクスは HTTP/1.1 と同じです。 HTTP/2 はテキストではなくバイナリです。 HTTP/2 は応答をヘッダー フレームとデータ フレームに分けます。
SPDY の改良点
HPACK圧縮
HPACK は、ヘッダーを圧縮するためのより高速かつスマートな方法です。この作品のために特別に設計されました。 Nginx の ngx_http_spdy_module は、CRIME による攻撃を受ける可能性があるため、ヘッダーの gzip 圧縮をデフォルトで無効にしています。
SSL/TLSは不要
HTTP/2 プロトコル自体には SSL/TLS 接続は必要ありません。しかし、すべての主要ブラウザベンダー Firefox、Chrome、Opera での実装には TLS が必要になると述べています。
ALPN
ALPN を使用すると、ブラウザとサーバーは、最初に HTTP/1.1 接続を確立してから HTTP/2 接続をネゴシエートするのではなく、最初から HTTP/2 接続を確立できます。 ALPN は、SPDY で使用される NPN を改良したものです。
Nginx で HTTP/2 を有効にする
バージョン 1.9.5 の時点で、Nginx は HTTP/2 をサポートしているため、少なくとも 1.9.5 の Nginx バージョンをインストールする必要があります。最新の Nginx を ngx_pagespeed モジュールでコンパイルすることもお勧めしますが、それはあなた次第です。その方法を確認するには、次のリンクを使用してください。
- 最新バージョンの Nginx を Ubuntu サーバーにインストールする
- Ubuntu サーバー上の ngx_pagespeed モジュールを使用して最新の Nginx バージョンをコンパイルすることで、サイトの速度を向上させます
SPDY と同様、Nginx で HTTP/2 を有効にするのは非常に簡単です。 Nginx が HTTP/2 モジュールでコンパイルされているかどうかを確認する
sudo nginx -V
Nginx のバージョンは 1.9.5 以上であるため、出力に次のテキストが表示されるはずです。
--with-http_v2_module
次にサーバーブロックファイルを設定します
sudo vi /etc/nginx/conf.d/yourdomain.conf
または
sudo vi /etc/nginx/sites-available/yourdomain.conf
[サーバー] セクションで、 listen 443 ssl の後に http2 を追加します。
server {
listen 443 ssl http2;
server_name www.linux-terminal.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
......
次に、ファイルを保存して閉じます。 Nginx 設定をリロードします。
sudo service nginx reload
または
sudo systemctl reload nginx
これで完了です。非常に簡単!
Web サイトで HTTP/2 が動作しているかどうかを確認する方法
https://tools.keycdn.com/http2-test に移動します。そしてドメインを入力します。 Cloudflare には、HTTP/2 のテストとデバッグのためのツールに関する優れた投稿があります。