Nginx HTTP/2セットアップと設定
Nginxでリクエストの多重化、HPACKヘッダー圧縮、ストリーム優先度によるHTTP/2を有効にし、高速なページ読み込みを実現する方法を解説。TLS設定が必要です。
詳細な説明
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接続の代わりに単一の接続ですべてのページリソースを読み込めるようにします。