はじめに
以下の構成の場合に、nginxでアクセス元(client)のIPアドレスがうまく取れなくて困った。
client -> ELB -> Varnish 4.1 -> nginx
※ Varnishとnginxは同一サーバ
nginxの設定
ELBを経由した場合は、「X-Forwarded-For」にクライアントIPが設定されるので、以下のように設定した。
nginx.conf
set_real_ip_from 127.0.0.1/32; # VarnishサーバのIP
real_ip_header X-Forwarded-For;
ただ、この設定だけだと、アクセス元IP「1.2.3.4」ではなく、ELBのIP「10.0.9.200」が出力されてしまった。
10.0.9.200 - - [17/Mar/2016:14:04:26 +0900] "GET / HTTP/1.0" 200 0 "http://xxxx/xxxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" "1.2.3.4, 10.0.9.200"
Varnishの設定
Varnish 4から、VarnishがX-Forwarded-ForにELBのIPを追加するらしい。
なので、Varnish側でX-Forwarded-Forからアクセス元IP(先頭のIP)を抜き出す必要がある。
default.vcl
sub vcl_recv {
set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For, "^([^,]+),?.*$", "\1");
}
こうすると、ELBのIPは排除されて、nginx側でクライアントIPが無事出力される。
1.2.3.4- - [17/Mar/2016:14:04:26 +0900] "GET / HTTP/1.0" 200 0 "http://xxxx/xxxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" "1.2.3.4"