Apache 2.4.55 に mod_h[ttp]2 の Ver.2.0.11 を突っ込んで
参照:mod_h2
半ば強引に HTTP/2 を有効化したったら
Apacheの最新版2.4.55をインストールしたところ、HTTP/2(mod_http2)を有効化するとホームページが表示されなくなるという現象に見舞われたのが前回のお話。一時的に HTTP/2 を無効化していたけど、このままじゃ何とも収まりが悪いよな。で、その後も色々ジタバタしてみました。
- mod_http2 だけ一世代前の Apache 2.4.54 の物を使ってみる
Apache 2.4.54 でビルドしたバイナリモジュール(mod_http2.so)が上書きされないよう保存しておき、Apache 2.4.55 インストール後にそれを読み込むようにさせたところ、ホームページは表示されるようになったのですが表示後に Apacheの子プロセスが SIGBUS (10) で落ちまくり。これでは運用に堪えないので、この方法はダメ。
- 一世代前の Apache 2.4.54 のmod_http2のソースコードを Apache 2.4.55 の物と置き換えてビルド
ビルドが途中で失敗し、バイナリモジュール(mod_http2.so)作成できず。
- githubからmod_h2(mod_http2)のソースを入手してビルドし、Apache 2.4.55環境にインストール
現在は、この方法で HTTP/2 を有効化しています。この方法でも色々問題がありましたので、以下にその顛末を備忘録代わりに記しておきます。
Apache の mod_http2 の元になっているのではないかと思われるソースが、github の mod_h2 にあります。現時点での最新版は 2.0.12 なのですが、Apache 2.4.55 の ChangeLogを読むと、Ver.2.0.10 を取り込んだって事なのではないでしょうかね?もしそうであって、Ver.2.0.10 に何らかの不具合が作り込まれたと言うことであれば、それよりも古いバージョンなら大丈夫なのでは?あるいは、新しいバージョンでその不具合が修正されていたりしないかな?
そう思って mod_h2(mod_http2)を Apache 2.4.55環境にインストールする事に挑戦してみました。
- mod_h2 releaseからソースを入手
今回は色々なバージョンで試したいので、最新版(2.0.12)から2.0.9までをダウンロードしました。
- 解凍する(以後は最新版 2.0.12 での例)
$ tar xzf mod_http2-2.0.12.tar.gz
|
- ビルドスクリプトを書く
今回は様々なバージョンの物をビルドするので、その都度コマンドを手打ちしていたら面倒臭いよね。なので、ビルド用のスクリプトを作っておくようにします。
$ cd mod_http2-2.0.12
$ vi build.sh
$ chmod +x build.sh
|
build.sh の内容はこんな感じです。
#!/usr/local/bin/bash -x
export MACODX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export PATH="${GCC}/bin:${PATH}"
export DYLD_LIBRARY_PATH="${GCC}/lib:${DYLD_LIBRARY_PATH}"
export PREFIX="/usr/local/apache2"
export APR="/usr/local/apache2"
export PKG_CONFIG_PATH="${APR}/lib/pkgconfig:${GCC}/lib:${PKG_CONFIG_PATH}"
export OPTFLAGS="-O2 -mpowerpc -mcpu=7450 -maltivec"
./configure \
--prefix=${PREFIX} \
--with-apxs="${APR}/bin/apxs" \
CC="${GCC}/bin/gcc" \
CPP="${GCC}/bin/cpp" \
CFLAGS="${OPTFLAGS} -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
CPPFLAGS="-I/usr/local/include -I/usr/include" \
LDFLAGS="-L/usr/local/lib -L/usr/lib"
make
|
注)「¥」は実際には半角の「\」(バックスラッシュ)
- ビルド
$ ./build.sh
〜略〜
+ make
Making all in mod_http2
make[1]: ディレクトリ '/home/hoge/mod_http2-2.0.12/mod_http2' に入ります
CC mod_http2_la-h2_bucket_beam.lo
CC mod_http2_la-h2_bucket_eos.lo
CC mod_http2_la-h2_c1.lo
CC mod_http2_la-h2_c1_io.lo
CC mod_http2_la-h2_c2.lo
CC mod_http2_la-h2_c2_filter.lo
CC mod_http2_la-h2_config.lo
CC mod_http2_la-h2_conn_ctx.lo
CC mod_http2_la-h2_headers.lo
CC mod_http2_la-h2_mplx.lo
CC mod_http2_la-h2_protocol.lo
CC mod_http2_la-h2_push.lo
CC mod_http2_la-h2_request.lo
CC mod_http2_la-h2_session.lo
CC mod_http2_la-h2_stream.lo
CC mod_http2_la-h2_switch.lo
CC mod_http2_la-h2_util.lo
CC mod_http2_la-h2_workers.lo
CC mod_http2_la-mod_http2.lo
CCLD mod_http2.la
../libtool: line 7899: func_munge_path_list: command not found
CC mod_proxy_http2_la-h2_proxy_util.lo
CC mod_proxy_http2_la-mod_proxy_http2.lo
CCLD mod_proxy_http2.la
../libtool: line 7899: func_munge_path_list: command not found
|
何やら libtool が良く分からんエラーを吐いています。どうやら configure が作る libtool に問題があるようです。
- libtoolのエラーを強行突破する
訳分からん libtool のエラーにつき合う気もないので、Apacheの libtool を使うように Makefile を修正して強行突破を計ります。
LIBTOOL = $(SHELL) $(top_builddir)/libtool
↓
LIBTOOL = $(SHELL) /usr/local/apache2/build/libtool
|
修正後、makeしてインストール。
$ make
Making all in mod_http2
〜略〜
make[1]: 'all-am' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/hoge/mod_http2-2.0.12' から出ます
$ sudo make install
|
- Apacheの設定で mod_http2.so を読み込む(HTTP/2を有効化)するよう変更して Apacheを再起動
以上で mod_h2 のオリジナルソースを使って Apache 2.4.55環境に mod_http2モジュールをインストールすることができるという事が分かりました。
動作確認してみたところ、mod_h2 の最新版 2.0.12 では現象変わらずホームページは表示されないままでしたが、そこからバージョンダウンさせていったところ Ver.2.0.11 で正常に表示されるようになりました。
Apache 2.4.55 のリリース日が 2023.1.17。一方 mod_h2(mod_http2)の方は、
- Ver.2.0.12(最新版):2023.1.29 リリース
- Ver.2.0.11:2022.10.23 リリース
- Ver.2.0.10(Apache 2.4.55 が取り込んだと思われる版):2022.10.11 リリース
というリリース日なのだけど、何故 mod_h2 Ver.2.0.12(最新版)とApache 2.4.55取り込みの Ver.2.0.10 で現象が起きて、Ver.2.0.11 では現象が起きないのだろう?謎だ・・・
と、これでHTTP/2 を有効化した状態で運用を続けられると思ったのも束の間。暫くすると httpd がハングしたような(無応答)状態になる事が分かりました。何となく多くのアクセスが記録された後に固まってしまうような感じです。そのため、またHTTP/2 を無効化した状態に戻しました。
う〜ん、やっぱり新しめの mod_h[ttp]2 だと安定しませんねぇ。もう少しバージョンダウンさせてみるか?
|