はじめに
コードを読もうと思ったキッカケは、mod_proxy_balancerでproxy先とWebSocket通信をするために、mod_rewriteを使ってURLを書き換えないと実現できなかったためです。
BalancerMemberディレクティブがhttpとwsの両方のプロトコルを同じproxy先で扱えるようになっていないため、なぜそのような振る舞いになるのか気になりました。
関連する実装で主要なところを一通り読んだので備忘録を兼ねて理解内容を記事にします。
時間が取れればmod_proxyだけでなく、mod_proxy_balancerやmod_proxy_wstunnelも整理して記事にする予定です。
我流で読み進めているので、理解内容に間違いなどありましたらご指摘ください。
(参考情報)mod_proxy_balancerとmod_rewriteを使って実現する方法
https, wssの例ですが、http, wsに直して上手くいきました。
コードリーディングの進め方
Apacheのモジュールのコードは初めて読むので、まずはApacheの全体のシーケンス(hookの呼ばれる順番など)を理解する必要があるだろうと考え、そこから始めました。
実行環境
- OS:CentOS 7.3
- Apache:v2.4.23
全体像の把握
全体シーケンス、各フェーズの役割
Apacheの処理の全体シーケンス、およびそれぞれのフェーズの役割については参考情報のページが理解するのに大変役立ちました。
私には、このページ以上に分かりやすく説明できないですし、Apacheモジュールのコードを読む、あるいはモジュール開発をする方は一読することをお勧めします。
フックの呼ばれる順番や、各フックの役割など大変参考になりました。
参考情報
mod_proxyに関わる各ファイルの説明
mod_proxyの実装は、私の環境では次の場所に格納されていました。
- httpd-2.4.23/modules/proxy
各ファイルの説明
| FileName | Description |
|---|---|
| mod_proxy.h | mod_proxy及びその後段(mod_proxy_httpなど)を含めて必要な構造体などを定義したヘッダファイル |
| mod_proxy.c | mod_proxyの本体の実装。詳細な処理は後段に委譲していたりする |
| mod_proxy_xxx.c | mod_proxy本体から委譲される処理をする実装ファイル |
次回の予定
今回は大まかな全体像について説明したので、次回はmod_proxyの実装の理解内容に入っていこうと思っています。