はじめに

Apache+Tomcat構成を運用しているが、Chromeの開発者ツールでネットワークのプロトコルを確認すると、HTTP/1.1での通信をしていることに気づいた。
HTTP/3が出ているのに、まだHTTP/1.1で通信になっているのは流石にと思ったので備忘録としてHTTP/2通信をできるようにした手順を記載しておく。

環境

1
2
3
4
Apache 2.4.58
Tomcat 9.0.85
Docker Desktop 4.28.0 (139021)
Docker version 25.0.3

準備

例によって、Dockerでの検証を行う。
今回は、Apache+Tomcatの構成で静的リソースをApacheに処理させるで使用したリポジトリを少しいじっているのでこれを使う。

http2対応にあたって

http2対応にあたって以下の条件を満たせているかどうかを確認する必要がある。

修正手順

1. mod_http2をインストールする

Apacheの有効なモジュール一覧を表示する。

1
httpd -M

mod_http2がない場合は、下記を実行しmod_http2を入れる。

1
yum install -y mod_http2

インストールコマンドについては、Docker内のパッケージマネージャに依存しているが、他のディストリビューションであれば下記のコマンドになると思われる。
apt-get, dnf

2. ApacheのMPM設定(prefork->event)をする

1
httpd -V

を実行した際に、Server MPM: preforkとなっている場合は修正する必要がある。
この場合下記のように修正する。(今回はeventに変更する)

1
vi /etc/httpd/conf.modules.d/00-mpm.conf
1
2
3
4
5
-LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
+#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

-#LoadModule mpm_event_module modules/mod_mpm_event.so
+LoadModule mpm_event_module modules/mod_mpm_event.so

面倒な場合は、sedで置き換えてもOK

1
2
3
sed -i.bak -e 's/^LoadModule mpm_prefork_module/#LoadModule mpm_prefork_module/' \
           -e 's/^#LoadModule mpm_event_module/LoadModule mpm_event_module/' \
           /etc/httpd/conf.modules.d/00-mpm.conf

3. ssl.confの設定

最後に、HTTP/2プロトコルを利用するための設定を行う。

1
vi /etc/httpd/conf.d/ssl.conf

で設定ファイルを開き、

1
2
3
4
5
6
7
<VirtualHost _default_:443>

+Protocols h2 http/1.1

...

</VirtualHost>

を記述し、設定は完了。

4. Apacheの再起動

1
systemctl restart httpd

Dockerの場合はコンテナをビルドし直して立ち上げてほしい。

1
docker compose up -d --build

※上記で設定は完了で、Tomcat側の設定は不要である。

一応、Claude3に聞いてみると、

APRコネクタ(AJPコネクタ)を使う場合は、Apacheが HTTP/HTTPSリクエストを受け付け、Tomcatへはプロキシ経由でリクエストが転送されます。したがって、この設定は不要です。

確認

Chromeでのhttp protocolの確認方法は下記を参考に。
https://www.sudshekhar.com/blog/http-protocol-check-in-chrome

今回 Dockerを使用している方であれば、https://localhost/sampleで確認が可能である。

https通信だと、protocolh2となっておりHTTP/2での通信がされている。
http2-protocol-01

http通信だと、protocolHTTP/1.1での通信がされている。 http2-protocol-02

参考

おわりに

Apache+TomcatでAJP連携しているサイトが業務であるのだが、HTTP/1.1のままなのでこの手順でアップグレードしていきたい。
Server MPMがpreforkだとHTTP/2通信になってくれなかったり、ハマることがあったが対応できてよかった。
HTTP/2対応は良いのだが、ApacheはHTTP/3対応がまだなので、このまま対応されなかったらnginxになっていくのだろうか。