2026年5月29日

2026年5月29日

ApacheのHTTP/2を有効化する方法|mod_http2の設定・前提条件・効かないときの確認

Apache で HTTP/2 を使うには、mod_http2 を読み込み、HTTPS のバーチャルホストに Protocols h2 http/1.1 を書くのが基本です。ただし、MPM が prefork のままだったり、HTTPS 化されていなかったりすると、設定を書いても HTTP/1.1 のまま動きます。この記事では、HTTP/2 を有効にする前に確認する前提条件、Ubuntu と RHEL系での設定手順、curl やブラウザでの確認方法、効かないときに原因を絞り込む順番を説明します。

HTTP/2を有効にする前に確認すること

HTTP/2 は、1本の接続の上で複数のリクエストを並行してやり取りできるプロトコルです。HTTP/1.1 のように「1つの接続で1つずつ順番に」ではないため、画像や CSS・JavaScript の多い WordPress のページでは、接続数や待ち時間を減らせる場合があります。ただ、効果の大きさはページの構成や回線状況で変わり、HTTP/2 にしただけで表示が大きく速くなるとは限りません。

有効化の前提条件は次の4つです。

  1. Apache 2.4.17 以降: mod_http2 は 2.4.17 で正式に加わりました。現在の主要なディストリビューションの標準パッケージはこれより新しいので、通常は問題になりません。
  2. HTTPS で配信していること: 主要なブラウザは、暗号化された接続(TLS)上の HTTP/2 にしか対応していません。HTTP のままのサイトでは、先に SSL/TLS を設定します。
  3. ALPN に対応した OpenSSL: ブラウザと Apache が「HTTP/2 で話す」と合意する仕組み(ALPN)は TLS の拡張で、OpenSSL 1.0.2 以降が必要です。こちらも現行のディストリビューションなら満たしています。
  4. MPM が prefork 以外: mod_http2 は prefork とは組み合わせて使えません。prefork のままだと、Apache は起動するものの HTTP/2 は無効のまま、エラーログに警告が出ます。event が推奨です。

現在の状態は次のコマンドで確認できます。

# Apache と OpenSSL のバージョン
apachectl -v
openssl version

# MPM と、http2 モジュールが読み込まれているか
apachectl -V | grep -i mpm
apachectl -M 2>/dev/null | grep -Ei "http2|ssl"

Ubuntu・Debian では apachectl の代わりに apache2ctl でもかまいません。MPM が prefork と表示された場合は、PHP を mod_php で動かしている可能性が高く、HTTP/2 の前に PHP-FPM と event への切り替えが必要です。切り替えは影響が大きいので、ステージング環境で先に試してください。

Ubuntu・Debianでの設定手順

作業前に /etc/apache2/ をバックアップしておきます。

sudo a2enmod http2

次に、HTTPS のバーチャルホストに Protocols を追加します。Protocols は Apache のコア機能のディレクティブで、サーバー全体(apache2.conf など)にも、バーチャルホストごとにも書けます。サイトごとに管理したいならバーチャルホストに書くのが分かりやすいでしょう。

# /etc/apache2/sites-available/example.com-ssl.conf
<VirtualHost *:443>
    ServerName example.com
    Protocols h2 http/1.1

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    # ... DocumentRoot などの既存の設定 ...
</VirtualHost>

h2 が TLS 上の HTTP/2、http/1.1 が従来の HTTP/1.1 です。http/1.1 も並べておくことで、HTTP/2 に対応していないクライアントはこれまでどおり接続できます。暗号化しない HTTP/2(h2c)という指定もありますが、ブラウザは使わないため、一般的な Web サイトでは指定しなくてかまいません。

設定したら構文を確認し、再読み込みします。

sudo apache2ctl configtest && sudo systemctl reload apache2

RHEL系(AlmaLinux・Rocky Linux など)での設定手順

RHEL 8 以降の系統では、mod_http2 が別パッケージになっている場合があります。インストール後、/etc/httpd/conf.modules.d/ 配下に http2 モジュールを読み込む設定ファイルが置かれます。ファイル名や標準の有効・無効はバージョンによって異なるので、apachectl -M で読み込まれているかを確かめてください。

sudo dnf install mod_http2
sudo apachectl -M 2>/dev/null | grep http2

Protocols h2 http/1.1 の追加先は、/etc/httpd/conf.d/ssl.conf の <VirtualHost _default_:443> か、自分で作ったサイトごとの設定ファイルです。設定後は sudo apachectl configtest で確認し、sudo systemctl reload httpd で反映します。

TLS設定で気を付けること

HTTP/2 の仕様では、TLS 1.2 以上の使用と、安全性の低い暗号スイートを避けることが求められています。古い設定のまま弱い暗号スイートを優先していると、ブラウザによっては HTTP/2 の接続を拒否することがあります。

暗号スイートを一から選ぶより、Mozilla が公開している「SSL Configuration Generator」で Apache とOpenSSL のバージョンを指定し、推奨設定(Intermediate など)を参考にするのが現実的です。古い端末からの接続をどこまで許すかで選ぶ設定が変わるため、サイトの利用者層に合わせて決めてください。

有効になったかを確認する

確認は、コマンドとブラウザの両方で行うと見落としを減らせます。

# レスポンスの1行目が「HTTP/2 200」なら HTTP/2 で通信している
curl -sI --http2 https://example.com/ | head -n 1

# ALPN のネゴシエーション結果を見る(「ALPN protocol: h2」と出れば合意できている)
openssl s_client -connect example.com:443 -servername example.com -alpn h2 </dev/null 2>/dev/null | grep -i alpn

curl の --http2 は、使っている curl が HTTP/2 に対応している必要があります。古い curl でオプションが使えない場合は curl -V の Features 欄に HTTP2 があるかを確認してください。

ブラウザでは、開発者ツールのネットワークタブで「プロトコル(Protocol)」の列を表示させると、リクエストごとに h2 か http/1.1 かが分かります。列が表示されていない場合は、列見出しの右クリックメニューから追加できます(表記はブラウザやバージョンによって異なります)。

HTTP/1.1のままのときに確認する順番

設定したのに HTTP/2 にならない場合は、可能性の高い順に次を確認します。

  1. **Protocols を書いた場所が違う**: ポート 80 のバーチャルホストにだけ書いていて、443 側に書いていないケースが多く見られます。Certbot が自動生成した -le-ssl.conf のような別ファイルが 443 を担当していることもあるので、apachectl -S で 443 を担当している設定ファイルを確認します。
  2. MPM が prefork のまま: エラーログに「is not supported by mod_http2」を含む警告が出ていないかを確認します。出ていれば MPM の切り替えが必要です。
  3. モジュールが読み込まれていない: apachectl -M に http2_module が出ているかを確認します。
  4. 手前に CDN やロードバランサーがある: Cloudflare などの CDN や、クラウドのロードバランサーが TLS を終端している場合、ブラウザが通信している相手は Apache ではありません。ブラウザから見たプロトコルは CDN 側の設定で決まり、Apache の HTTP/2 設定は CDN とサーバーの間の通信にしか関係しません。
  5. 古い接続が使い回されている: ブラウザが設定変更前の接続を保持していることがあります。ブラウザを再起動するか、別のブラウザで確認します。

有効化した後の注意点

HTTP/2 には「サーバープッシュ」という機能がありましたが、主要なブラウザは対応を取りやめています。mod_http2 にもプッシュ関連のディレクティブがありますが、新たに使う理由はほとんどありません。読み込みを早めたいリソースがあるなら、HTML の <link rel="preload"> や、103 Early Hints(mod_http2 の H2EarlyHints)を検討します。Early Hints への対応状況はブラウザによって異なるので、導入するなら効果を計測してください。

HTTP/1.1 時代の高速化の工夫、たとえば静的ファイルを複数のサブドメインに分けて配信する方法(ドメインシャーディング)は、HTTP/2 では接続をまとめられなくなり逆効果になることがあります。一方、CSS や JavaScript の結合をやめるべきかはファイル数やキャッシュの効き方で変わるため、PageSpeed Insights などで計測しながら判断してください。

HTTP/3 については、標準の Apache httpd には実装が含まれていません(2026年10月現在)。HTTP/3 を使いたい場合は、対応した CDN を前段に置くか、HTTP/3 に対応した別の Web サーバーを検討することになります。

まとめ

  • 前提条件は Apache 2.4.17 以降、HTTPS 化、ALPN 対応の OpenSSL、prefork 以外の MPM。prefork のままでは HTTP/2 は有効にならない。
  • a2enmod http2(RHEL系は mod_http2 パッケージ)でモジュールを読み込み、443 のバーチャルホストに Protocols h2 http/1.1 を書く。
  • curl -sI --http2 やブラウザの開発者ツールで h2 になっているかを確かめる。
  • 効かないときは、設定を書いた場所、MPM、モジュール、前段の CDN の順に確認する。
  • サーバープッシュは使わず、必要なら preload や Early Hints を計測しながら使う。バージョンやパッケージの構成は環境によって異なるため、作業前にバックアップを取り、ステージングで試してください。

お気軽にご相談ください

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