しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Application Request Routing (ARR) を使う場合に必ず設定しておきたい項目

最近は ARR を Azure に作成して遊んでいるので、デフォルトのままだと後で困りそうな設定を紹介しておきます。思ったより ARR の情報が少ないので頑張っていきたい。

クライアント IP アドレスの保存

ARR を使ってリバースプロキシを設定すると、アクセスされる Web サーバーのログには ARR の IP アドレスが記録されます。リバースプロキシなので当然と言えば当然の動作です。

実際に ARR でリバースプロキシを設定してアクセスした場合のログです。クライアント IP として 10.0.0.4 という ARR のプライベート IP アドレスが書き込まれているのが確認できます。

f:id:shiba-yan:20150130013524p:plain

しかし、わざわざ ARR の IP アドレスをログに記録したいわけではないので、クライアントの IP アドレスをログに記録する方法を 2 つ試しました。

1. カスタムフィールドを追加する

IIS Manager のログ記録を選ぶとカスタムフィールドを追加できるようになっているので、ここで X-Forwarded-For の値を書き出すように設定します。

f:id:shiba-yan:20150129225742p:plain

これでログに X-Forwarded-For の値が original-ip という名前で書きだされるようになります。

実際に Web サイトにアクセスしてみて、ログを出力させて確認してみます。

f:id:shiba-yan:20150130105936p:plain

c-ip は ARR のプライベート IP アドレスのままですが、ログの最後にクライアントの IP アドレスとポート番号が表示されるようになりました。

2. ARR Helper を使う

よくよく考えてみると、Azure Websites は同じように ARR を使っているにもかかわらず、ログにはちゃんとクライアントの IP アドレスが出力されるわけです。気になったので確認してみると ARR Helper をインストールして対応しているようでした。

ARR Helper は ARR 環境下で良い感じにログを出力してくれる便利モジュールといった感じです。

Anil Ruia's Blog - Client-ip not logged on application server when using ARR

使い方はとても簡単で、x86/x64 版を選んでインストールするだけです。それだけで IIS ログの c-ip がクライアントの IP アドレスに変わります。

f:id:shiba-yan:20150130105103p:plain

あと X-ARR-LOG-ID がクエリ文字列として出力されるので、ARR 側のログと対応付けるのも簡単ですね。

HTTP Host ヘッダを保持する

デフォルトの構成で ARR を使ってリバースプロキシを組むと、HTTP Host ヘッダーが Web サーバーのプライベート IP アドレスになります。これ自体はまあ当然な気がします。

f:id:shiba-yan:20150130160126p:plain

しかし、アプリケーション側で Host ヘッダを見て URL を組み立てる場合に、プライベート IP アドレスがホストになってしまうことがあります。特に ASP.NET の Request.Url でこの問題が発生します。

回避するためには ARR の設定にある preserveHostHeader を True にすれば OK です。IIS Manager の ARR 設定には存在していないので、構成エディターから設定する必要があります。

f:id:shiba-yan:20150130160350p:plain

もしくは AppCmd.exe を使って以下のコマンドを叩き込みます。

appcmd.exe set config  -section:system.webServer/proxy /preserveHostHeader:"True" /commit:apphost

これで元々の Host ヘッダーが保持されるので、ASP.NET の Request.Url を使った場合でも正しいホスト名で構成された URL を得ることが出来ます。

f:id:shiba-yan:20150130160816p:plain

ARR の設定は他にも色々とあるみたいなので、IIS Manager に頼りっきりというのは良くないようです。