[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-For
とX-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が取れるということなのか?