EC2 のロードバランサーの内側の lighttpd で本来のアクセス元 IP アドレスを取得する方法

Amazon EC2ロードバランサーのオプションの Elastic Load Balancing は便利なのですが、これを経由すると内側の lighttpdアクセスログにはアクセス元 IP アドレスは 10.204.xx.xx などと、全てロードバランサーの IP アドレスになってしまいます。これを本来のアクセスしてきたユーザーのリモート IP アドレスを記録する方法を紹介します。

ロードバランサーはアクセス元の IP アドレスを HTTP_X_FORWARDED_FOR ヘッダに付加して内側の Web サーバーにリクエストを送ります。

lighttpd ではこれを、mod_extforward により、リモート IP アドレスとして取り扱います。Apache でいうところの mod_rpaf にあたるものですね。

lighttpd.conf に下記のようにロードバランサーの IP アドレスを指定すると、本来の IP アドレスを取得することができるようになります。

server.modules += ( "mod_extforward" )
extforward.forwarder = (
    "10.204.xx.xx" => "trust"
)

さらに内側のアプリケーションサーバーで Plack を使っている場合は、Plack::Middleware::ReverseProxy を利用しましょう。