最近は ARR を Azure に作成して遊んでいるので、デフォルトのままだと後で困りそうな設定を紹介しておきます。思ったより ARR の情報が少ないので頑張っていきたい。
クライアント IP アドレスの保存
ARR を使ってリバースプロキシを設定すると、アクセスされる Web サーバーのログには ARR の IP アドレスが記録されます。リバースプロキシなので当然と言えば当然の動作です。
実際に ARR でリバースプロキシを設定してアクセスした場合のログです。クライアント IP として 10.0.0.4 という ARR のプライベート IP アドレスが書き込まれているのが確認できます。
しかし、わざわざ ARR の IP アドレスをログに記録したいわけではないので、クライアントの IP アドレスをログに記録する方法を 2 つ試しました。
1. カスタムフィールドを追加する
IIS Manager のログ記録を選ぶとカスタムフィールドを追加できるようになっているので、ここで X-Forwarded-For の値を書き出すように設定します。
これでログに X-Forwarded-For の値が original-ip という名前で書きだされるようになります。
実際に Web サイトにアクセスしてみて、ログを出力させて確認してみます。
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 アドレスに変わります。
あと X-ARR-LOG-ID がクエリ文字列として出力されるので、ARR 側のログと対応付けるのも簡単ですね。
HTTP Host ヘッダを保持する
デフォルトの構成で ARR を使ってリバースプロキシを組むと、HTTP Host ヘッダーが Web サーバーのプライベート IP アドレスになります。これ自体はまあ当然な気がします。
しかし、アプリケーション側で Host ヘッダを見て URL を組み立てる場合に、プライベート IP アドレスがホストになってしまうことがあります。特に ASP.NET の Request.Url でこの問題が発生します。
回避するためには ARR の設定にある preserveHostHeader を True にすれば OK です。IIS Manager の ARR 設定には存在していないので、構成エディターから設定する必要があります。
もしくは AppCmd.exe を使って以下のコマンドを叩き込みます。
appcmd.exe set config -section:system.webServer/proxy /preserveHostHeader:"True" /commit:apphost
これで元々の Host ヘッダーが保持されるので、ASP.NET の Request.Url を使った場合でも正しいホスト名で構成された URL を得ることが出来ます。
ARR の設定は他にも色々とあるみたいなので、IIS Manager に頼りっきりというのは良くないようです。