Syntax Error.

[Sy] nginx(リバースプロキシ)+node.jsでクライアントのIPがすべて127.0.0.1になってしまう場合の対処

2015/07/16

nginxをリバースプロキシにしてnode.jsのアプリでクライアントのIPを取ろうとしたら、全部127.0.0.1になってしまいました。その対処についてです。

やったこと

最初に/var/log/nginx/access.logを見ると、ここにはちゃんとクライアントのIPらしき値が取れてました。

ということで、うまくプロキシに届いた情報をnode.js側に渡せてないということ?

調べてみると、/etc/nginx/nginx.confにてヘッダーにX-Forwarded-ForX-Real-IPというのを追加する設定が必要ということがわかったので修正してみます。

server {
  listen 80;
  server_name www.example.com;
  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr; ⇐追加
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ⇐追加
  }
}

nginxを再起動します。

$ sudo /etc/init.d/nginx restart

その後node.js側でreqオブジェクトの中身を見てみると、

・
・
・
headers:
 { host: 'www.example.com',
   'x-real-ip': '192.168.33.1',
   'x-forwarded-for': '192.168.33.1',
・
・
・

といった感じでreq.headers['x-real-ip']req.headers['x-forwarded-for']でクライアントのIPが取れるようになり解決です。

(おまけ)X-Forwarded-ForとX-Real-IPの違い

調べてみても正直よくわからなかったです。

多段のプロキシとかになると、X-Forwarded-Forはカンマ区切りでIPが追加されていき、X-Real-IPの場合は直前のマシンのIPが取れるということなのか?

参考