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 の設定」も参照してください。