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

投稿者: | 2018年12月13日

アクセス経路が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

このような場合に備えて、intra-mart側には動的にBaseURLを切り替える仕組みがります。 BaseUrlProvider (javadoc-all-dev 8.0.0 API)

BaseUrlProvider

リバプロ側には、httpのリクエスト中にどちらからアクセスされたかを識別するためのリクエストヘッダを埋め込み、Providerのプログラムでは、ヘッダを読み取ってBaseURLを返すようにします。

細かなところは下記FAQが参考になります。

intra-mart FAQサイト FAQ詳細

ほかの方法はどうか

とはいえ、intra-martの構築担当となった人間としては、BaseUrlProviderを使ったプログラムを書く、というのは実務的にはできればやりたくはない類の開発ですよね。画面やバッチを書くのはともかく、基盤機能を作るとなると、今後作成されるすべてのアプリに影響が来ます。

ではほかの候補はどうかというと、リバプロ側でhtml中にある「BaseUrl」書き換えるというのも考えられます。リバプロが、例えば「nginx」なのだとしたら、「sub_filter」というものを使って書き換えることができるようです。

http://nginx.org/en/docs/http/ngx_http_sub_module.html

しかしながら、htmlを書き換える方法は、intra-mart側が認識しているBaseURLと、クライアント側に来たBaseURLが異なるという状態が生じることになるので、デメリットもあります。

例えばメール定義です。intra-martといえばワークフローですが、申請者が申請すると承認者にメールが飛びます。そのメールには、「ログインURLはここです」と出ているわけです。 ここで、メールに記載している「https://192.168.11.100/imart/login」というURLは、「リバプロ」で書き換えることができません。

したがって、やはり上記のProviderを使うのが王道です。

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

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

リバプロ側の設定

リバプロが既存のものだと、httpのリクエストヘッダにどのようなものが設定されているかは不明であるし、 結局はリバプロの実装次第だが、 X-Forwarded-Forがあればできます。

X-Forwarded-For – Wikipedia

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

・リバプロ#1→AP

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

コメントを残す

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