Nginx HTTP/2セットアップと設定

Nginxでリクエストの多重化、HPACKヘッダー圧縮、ストリーム優先度によるHTTP/2を有効にし、高速なページ読み込みを実現する方法を解説。TLS設定が必要です。

Performance

詳細な説明

HTTP/2は多重化、ヘッダー圧縮、ストリーム優先度によりWebパフォーマンスを大幅に向上させます。Nginxでの有効化は簡単で、ほとんどのWebサイトに即座に測定可能な効果をもたらします。

HTTP/2の有効化

listen ディレクティブに http2 パラメータを追加します。実際には、すべての主要ブラウザがHTTP/2プロトコルに暗号化接続を強制するため、SSL/TLSが必要です:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;
}

HTTP/2の主なメリット

多重化により、単一のTCP接続上で複数のリクエストとレスポンスを同時に送受信でき、HTTP/1.1で問題だったヘッドオブラインブロッキングが解消されます。ヘッダー圧縮はHPACKアルゴリズムにより、Cookie、ユーザーエージェント、認証トークンなどリクエスト間で同一の繰り返しヘッダーのオーバーヘッドを大幅に削減します。ストリーム優先度によりブラウザが最も重要なリソースを通知でき、サーバーが配信順序を最適化できます。

サーバープッシュ

HTTP/2のサーバープッシュにより、ブラウザがリクエストする前にNginxがリソースをプロアクティブに送信できます:

location / {
    http2_push /styles/main.css;
    http2_push /scripts/app.js;
    proxy_pass http://backend;
}

ただし、サーバープッシュはブラウザが既にキャッシュ済みのリソースを送信して帯域幅を浪費する可能性があるため、現代のWeb開発では主流ではなくなっています。代わりに 103 Early Hints レスポンスや <link rel="preload"> ヘッダーが推奨されています。

チューニングパラメータ

トラフィックパターンに基づいてHTTP/2固有の設定を調整します:

http2_max_concurrent_streams 128;
http2_recv_buffer_size 256k;
http2_chunk_size 8k;

http2_max_concurrent_streams は各クライアント接続が維持できる同時ストリーム数を制御し、128がほとんどのアプリケーションに適切なデフォルトです。

TLS設定要件

HTTP/2はTLS 1.2以上と特定のAEAD暗号スイートを必須としています。SSL設定がこれらの要件を満たしていることを確認してください:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

HTTP/2の検証

curlでレスポンスを確認してHTTP/2が有効であることを検証します:

curl -I --http2 https://example.com

レスポンス行に HTTP/2 200 が表示されることを確認します。ブラウザの開発者ツールのネットワークタブでも各リクエストのプロトコルバージョンを確認できます。

後方互換性

NginxはALPN(Application-Layer Protocol Negotiation)を通じて各クライアントとプロトコルバージョンを自動的にネゴシエートします。HTTP/2をサポートしないクライアントは設定変更やユーザー影響なしにHTTP/1.1にシームレスにフォールバックします。

ユースケース

HTTP/2の多重化を有効にしてWebサイトの読み込みパフォーマンスを向上させ、ブラウザが複数のTCP接続の代わりに単一の接続ですべてのページリソースを読み込めるようにします。

Try It — Nginx Config Generator

フルツールを開く