在 Node.js 中获取客户端 IP

在 Node.js 中获取客户端 IP 其实很简单:

var ip = req.connection.remoteAddress || req.socket.remoteAddress;

但有些时候 Node 只是作为了一个中间层,前面会有 Nginx 做转发,因此转发时还需要把 IP 带上:

upstream node {
server 127.0.0.1:3000;
keepalive 64;
}

server {
listen 80;
server_name xxx.xxx.xxx;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass http://node;
}
}

在上面 Nginx 的配置中把客户端真实 IP 放在了 header 中,字段为 X-Real-IP,以及反向代理生成的 IP 放在了 X-Forwarded-For 字段中,格式为 X-Forwarded-For: client1, proxy1, proxy2,我们用的时候用第一个就可以。

这个时候在 Node.js 使用时就应该这样写:

var ip = (req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress).split(',')[0] || '';