手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Apache HTTP/2 有効化 – TLS VirtualHost で h2 を使う

Ubuntu 22.04 の Apache で HTTP/2 を使う場合、TLS VirtualHost が前提になります。HTTP/2 は単にモジュールを有効化するだけでなく、Protocols、ALPN、MPM、PHP 実行方式との関係を確認しておく必要があります。

この記事では、既存の TLS VirtualHost に h2 を追加し、curlopenssl 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 http2

TLS 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 200using 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/null

MPM と PHP 実行方式を確認する

Apache の MPM と PHP 実行方式によっては、HTTP/2 を有効化しても期待通りの構成にならないことがあります。特に libapache2-mod-phpprefork と組み合わせられることが多く、イベント駆動の構成とは相性が異なります。

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 実行方式も含めて確認するのが安全です。

関連する記事
Ubuntu 22.04 Apache HTTP/2 有効化 – TLS VirtualHost で h2 を使う

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る