̃Gg[͂ĂȃubN}[Nɒlj

ロードバランサにアクセスしてきた実際のIPアドレスのログを出力する



Apache(WEBサーバー)において、通常ではロードバランサ経由でアクセスしてきた端末(PC、スマホなど)のIPアドレスを知ることができません。
アクセスログに残るのは、Apacheにアクセスしてきた直前のIPアドレスであるロードバランサのIPアドレスが記録されるためです。

①端末(PC、スマホなど) -> ②ロードバランサ -> ③Apache(WEBサーバー)

                                         ↑このIPアドレスが記録される


①のIPアドレスも記録するには、以下のように httpd.conf の LogFormat に「%{X-Forwarded-For}i」という設定を加えます。


httpd.conf の設定

  • conf/httpd.conf(*1)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" x_forwarded_for

LogFormat の設定に次の行を追加します。

LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" x_forwarded_for

識別子を「x_forwarded_for」としています。

*1:httpd.conf は confディレクトリ配下にあるとは限りません。環境により異なります。


httpd-vhosts.conf の設定

次に httpd-vhosts.conf などのバーチャルホストの CustomLog 設定を以下のように「x_forwarded_for」として変更します。

  • conf.d/httpd-vhosts.conf (*2)
<VirtualHost *:80>
    DocumentRoot /path/to/public_html
    ServerName example.com
    ErrorLog logs/example-error_log
    #CustomLog logs/example-access_log common(*3)
    CustomLog logs/example-access_log x_forwarded_for
</VirtualHost>

元からあった CustomLog … の行をコメントアウトして、
CustomLog … x_forwarded_for の行を追加します。

*2:httpd-vhosts.conf は conf.dディレクトリ配下にあるとは限りません。
また、httpd-vhosts.conf というファイル名でない場合があります。
環境によってはバーチャルホストの設定が httpd.conf に書かれている場合があります。

*3:common 以外(例えば combined)となっている場合があります。
また、「”%h %l %u %t \”%r\” %>s %b”」のように LogFormat が直接書かれている場合があります。
その場合は「%{X-Forwarded-For}i」を好きな位置に追加します。


Aapache の設定をリロード

最後に Aapache の設定をリロードします。

% sudo /etc/init.d/httpd configtest(念のため config に文法エラーがないかチェックする)
% sudo /etc/init.d/httpd reload

問題なければ、端末(PC、スマホなど)のIPアドレスがアクセスログに出力されるようになっていると思います。


補足:SSL(https)のホストの場合

SSL(https)のホストの場合は、この方法でIPアドレスが取得できるかはロードバランサの設定に依存するようです。
ですので、暗号化されている場合はこの手順が有効でない場合があります。




server/apache/etc/x_forwarded_for.txt