Ubuntu 22.04 の Apache で HTTP/2 を使う場合、TLS VirtualHost が前提になります。HTTP/2 は単にモジュールを有効化するだけでなく、Protocols、ALPN、MPM、PHP 実行方式との関係を確認しておく必要があります。
この記事では、既存の TLS VirtualHost に h2 を追加し、curl と openssl s_client で HTTP/2 と ALPN を確認する流れを扱います。Ubuntu 22.04 の既存環境を保守するための確認記事です。
- Apache HTTP/2 の前提
http2モジュールの有効化Protocols h2 http/1.1の設定curlと ALPN による確認- MPM と mod_php の注意点
書籍
Advanced Ubuntu Administration and Management Best Practices
Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
HTTP/2 を有効化する前提
Apache の HTTP/2 は、通常 TLS と組み合わせて使います。クライアントとサーバーは TLS の ALPN で h2 を交渉します。
- TLS VirtualHost が動作している
- サーバー証明書の名前検証が通る
http2モジュールが有効である- VirtualHost に
Protocols h2 http/1.1を設定する - MPM と PHP 実行方式の制約を確認する
先に HTTPS が正しく動作していることを確認してから HTTP/2 を追加すると、証明書の問題と HTTP/2 の問題を分けて見られます。
HTTP/2 モジュールを有効化する
http2 モジュールを有効化し、構文確認後に Apache を reload します。
sudo a2enmod http2
sudo apache2ctl configtest
sudo systemctl reload apache2
apache2ctl -M | grep http2TLS VirtualHost に Protocols を設定する
TLS 用 VirtualHost に Protocols h2 http/1.1 を追加します。HTTP/2 に対応しないクライアントも使えるよう、http/1.1 も残します。
sudo tee /etc/apache2/sites-available/server.example.local-ssl.conf >/dev/null <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName server.example.local
ServerAdmin webmaster@example.local
DocumentRoot /var/www/server.example.local
SSLEngine on
Protocols h2 http/1.1
SSLCertificateFile /etc/ssl/local/server.example.local.crt
SSLCertificateKeyFile /etc/ssl/local/server.example.local.key
ErrorLog ${APACHE_LOG_DIR}/server.example.local-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/server.example.local-ssl-access.log combined
</VirtualHost>
</IfModule>
EOF
sudo apache2ctl configtest
sudo systemctl reload apache2既存ファイルに追記する場合でも、最終的に VirtualHost 全体がどうなっているかを確認します。部分的な置換だけで済ませると、複数 VirtualHost がある環境で意図しない箇所へ入ることがあります。
sudo apache2ctl -S
sudo grep -R "Protocols" /etc/apache2/sites-enabled/ /etc/apache2/sites-available/curl で HTTP/2 を確認する
curl が HTTP/2 に対応していれば、--http2 を付けて確認できます。
curl -I --http2 https://server.example.local/
curl -v --http2 https://server.example.local/ 2>&1 | grep -i 'using http'HTTP/2 200 や using HTTP/2 が確認できれば、クライアント側では HTTP/2 で接続できています。
ALPN を確認する
openssl s_client で ALPN の交渉結果を確認します。ALPN protocol: h2 が表示されれば、TLS の段階で HTTP/2 が選ばれています。
openssl s_client -connect server.example.local:443 -servername server.example.local -alpn h2 -CAfile /etc/ssl/certs/ca-certificates.crt </dev/null
openssl s_client -connect server.example.local:443 -servername server.example.local -alpn 'h2,http/1.1' -CAfile /etc/ssl/certs/ca-certificates.crt </dev/nullMPM と PHP 実行方式を確認する
Apache の MPM と PHP 実行方式によっては、HTTP/2 を有効化しても期待通りの構成にならないことがあります。特に libapache2-mod-php は prefork と組み合わせられることが多く、イベント駆動の構成とは相性が異なります。
apache2ctl -V | grep -i mpm
apache2ctl -M | grep -E 'mpm|php|http2'WordPress などを本格運用する場合は、mod_php のままにするか、PHP-FPM と event MPM へ寄せるかを別途検討します。既存環境では、いきなり実行方式を変えず、影響範囲を確認します。
ログを確認する
HTTP/2 有効化後は、Apache のログとエラーログを確認します。ALPN や MPM の警告、VirtualHost の設定ミスが出ていないかを見ます。
sudo journalctl -u apache2 -n 80 --no-pager
sudo tail -n 80 /var/log/apache2/server.example.local-ssl-error.log
sudo tail -n 80 /var/log/apache2/error.log運用上の注意
- HTTP/2 の前に HTTPS の名前検証を通しておく
Protocols h2 http/1.1を VirtualHost ごとに確認する- ALPN の結果を
openssl s_clientで確認する - mod_php と MPM の関係を確認する
- reverse proxy や load balancer が前段にある場合は、前段と後段を分けて確認する
HTTP/2 は有効化できても、前段のプロキシやロードバランサーが HTTP/1.1 で終端していると、クライアントから見える結果が変わります。接続経路のどこで TLS と HTTP/2 を終端するかを意識します。
まとめ
Ubuntu 22.04 の Apache で HTTP/2 を使うには、TLS VirtualHost に Protocols h2 http/1.1 を設定し、http2 モジュール、ALPN、MPM、PHP 実行方式を確認します。
curl だけでなく openssl s_client で ALPN を見ると、HTTP/2 が選ばれていない原因を切り分けやすくなります。Apache 単体ではなく、前段プロキシや PHP 実行方式も含めて確認するのが安全です。

