2026年5月22日

2026年5月22日

NginxでHTTP/2を有効にする方法|http2 onとlisten http2の使い分け

HTTP/2 は、1本の接続で複数のファイルを並行して送れる HTTP の版で、画像や CSS が多いページの読み込みを効率よくします。Nginx では設定を数行加えるだけで有効になりますが、Nginx のバージョンによって書き方が違うので、先にバージョンを確かめます。

主要なブラウザは HTTPS(TLS)の上でだけ HTTP/2 を使うため、Web サイトで HTTP/2 を使うには HTTPS の設定が済んでいる必要があります。まだの場合は「Certbot で Nginx に Let's Encrypt の証明書を設定する」を先に行ってください。

バージョンとモジュールを確かめる

# バージョン
nginx -v

# HTTP/2 モジュールが組み込まれているか(何か表示されれば組み込み済み)
nginx -V 2>&1 | grep -o with-http_v2_module

HTTP/2 のモジュール(ngx_http_v2_module)は、ソースから自分でビルドする場合は --with-http_v2_module を付けないと組み込まれません。Ubuntu・Debian・RHEL 系の公式パッケージや nginx.org のパッケージには組み込まれています。

バージョンによって、設定の書き方が次のように分かれます(各配布物のバージョンは2026年11月時点で確認)。

Nginx のバージョン 書き方 該当する例
1.25.1 以降 http2 on; を server に書く Debian 13(1.26)、nginx.org の現行パッケージ
1.9.5〜1.25.0 listen 443 ssl http2; と listen に書く Ubuntu 24.04(1.24)、Debian 12(1.22)、RHEL 9・Rocky Linux 9 の標準(1.20)

1.25.1 以降で listen ... http2 と書いても動きますが、nginx -t で「the "listen ... http2" directive is deprecated」という警告が出ます。逆に 1.25.0 より前で http2 on; と書くと「unknown directive "http2"」というエラーで起動できません。

1.25.1 以降の設定例

HTTPS の server ブロックに http2 on; を1行加えます。設定ファイルの場所は環境によって違い、Ubuntu・Debian では /etc/nginx/sites-available/ 、RHEL 系や nginx.org のパッケージでは /etc/nginx/conf.d/ 以下が一般的です。

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com;
    # 以下、既存の設定
}

http2 は server ブロックごとに有効にできます(http ブロックに書けば、その中のすべての server に効きます)。

1.25.0 より前の設定例

listen の行に http2 を加えます。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com;
    # 以下、既存の設定
}

この書き方では、HTTP/2 は「同じアドレスとポート」の単位で有効になります。同じ 443 番ポートで複数のサイトを動かしている場合、どれか1つの listen に http2 を付けると、そのポートのほかのサイトでも HTTP/2 が使われます。

Certbot が自動で書き換えた設定ファイルでも、listen 443 ssl; の行(# managed by Certbot が付いた行)に http2 を加えて問題ありません。

設定を反映する

構文を確かめてから、読み込み直します。reload なら接続中の訪問者を切らずに反映できます。

sudo nginx -t
sudo systemctl reload nginx

nginx -t で syntax is ok と test is successful が出れば反映して大丈夫です。

HTTP/2 で通信しているか確かめる

curl で確かめる

curl -sI --http2 https://example.com/ | head -1

1行目が HTTP/2 200 なら HTTP/2 で応答しています。HTTP/1.1 200 OK のままなら、設定が反映されていないか、別の server ブロックが応答しています。

アクセスログで確かめる

標準のログの形式では、リクエストの行にプロトコルが記録されます。

"GET / HTTP/2.0" 200 896 "-" "curl/8.14.1"

HTTP/2.0 と記録されていれば HTTP/2 です。

ブラウザで確かめる

Chrome や Firefox の開発者ツールの「Network(ネットワーク)」タブで、列の見出しを右クリックして「Protocol」を表示すると、HTTP/2 の通信は h2 と表示されます。

注意点

  • HTTP/2 サーバープッシュは使えません: 1.25.1 で HTTP/2 サーバープッシュが削除され、http2_push と http2_push_preload は無効な設定になりました。古い記事にある http2_push の設定は書かないでください。
  • Cloudflare などの CDN を通している場合: 訪問者のブラウザとの通信は CDN が担うため、ブラウザの開発者ツールに表示されるのは CDN との間のプロトコルです。自分のサーバーの設定を確かめるときは、サーバーのアクセスログを見ます。
  • ssl_ciphers を自分で指定している場合: Nginx の公式ドキュメントでは、ssl_prefer_server_ciphers on のとき、ssl_ciphers を RFC 9113 の付録 A(HTTP/2 で使ってはいけない暗号の一覧)に沿った、クライアントが対応している内容にするよう求めています。古い暗号の並びをそのまま使っている場合は見直してください。

まとめ

  • nginx -v でバージョンを確かめ、1.25.1 以降は http2 on;、それより前は listen 443 ssl http2; と書く
  • HTTP/2 を使うには HTTPS の設定が先に必要
  • sudo nginx -t で確認してから sudo systemctl reload nginx で反映する
  • curl -sI --http2 の1行目、またはアクセスログの HTTP/2.0 で確かめる

WordPress を Nginx で動かすときの圧縮の設定とあわせて見直すなら「WordPress 向けの Nginx の gzip と HTTP/2 の設定」も参照してください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲