LoginSignup
4
5

More than 5 years have passed since last update.

AWS ELB -> Varnish -> nginx の構成の場合に、nginxでアクセス元のIPアドレスを取得する

Last updated at Posted at 2016-03-21

はじめに

以下の構成の場合に、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"

Varnish参考記事

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5