元情報系学生なプログラマの備忘録

情報系学生だったプログラマが現場で学んだこと感じたことを書く備忘録

【intra-mart】リバースプロキシにドはまりした思い出(2)

アクセス経路が2つ以上ある場合、server-context-config.xmlを使ってBaseURLを定義することができません。

例えばリバプロが2つある場合、server-context-config.xmlにリバプロ#1、#2のどちらも書けません。また、定義しない場合には、どちらもAPサーバのIPアドレス(192.168.11.100)がBaseURLに設定されてしまい、リバプロが使われません。

f:id:s06068ss:20181213142911p:plain

アクセス経路が2つの場合

 

このような場合に備えて、intra-mart側には動的にBaseURLを切り替える仕組みはある。

BaseUrlProvider (javadoc-all-dev 8.0.0 API)

 

BaseUrlProvider

リバプロ側には、httpのリクエスト中にどちらからアクセスされたかを識別するためのリクエストヘッダを埋め込む

→Providerのプログラムでは、ヘッダを読み取ってBaseURLを返すようにする。

細かなところは

intra-mart FAQサイト FAQ詳細

 

ほかの方法はどうか

BaseUrlProviderを使ったプログラムを書く、というのは実務的にはできればやりたくはない類の開発だ。

ほかの候補としては、リバプロ側でhtml中にある「BaseUrl」書き換えるというのも考えらえる。

しかしながら、htmlを書き換えるてもintra-mart側が認識しているBaseURLとは異なるので少なくともAPサーバから送付されるメールなどには対応できない為、まっとうにやるならこの方法だ。

 

継続的にintra-mart開発をするならimm化して持っておいたほうが良い

Httpのヘッダ名と値、返すBaseURLの3セットをXMLファイルなどに定義しておいて対応できるようなモジュールを持っておくとよい。

(というか公式にそういうものを用意してもらえると助かるんだが)

 

リバプロが既存のものだったらどうしよう

リバプロが既存のものだと、httpのリクエストヘッダにどのようなものが設定されているかは不明である。

 

この点が2つ目のハマってしまったポイントだった。

結局はリバプロの実装次第なので、片方のリバプロには、

X-Forwarded-For - Wikipedia

が設定されているのでこれが使える。と思っても、もう片方のリバプロでは付与されていないということはある。

あるいは、

・リバプロ#2→リバプロ#1→APというような多段階プロキシになっている経路

・リバプロ#1→AP

といった2経路の場合、どちらも同じヘッダに書き変わってしまうとAPサーバでは識別できない。

リバプロがどのようなhttpリクエストであるかは、調査の必要があるが、BaseUrlProviderの実装にデバッグモードのようなものを実装しておき受け取ったhttpヘッダの出力できるようにしておくとはかどる。