问题

Nginx 反向代理后,后端拿到的用户 IP 都是 127.0.0.1

应用放在 Nginx 后面,日志里记录的访问 IP 全是 127.0.0.1,怎么拿到用户的真实 IP?

Mores小栋博客!

0

反向代理以后,和应用建立连接的是 Nginx,应用看到的来源地址自然是 Nginx 所在的地址。需要 Nginx 把真实 IP 放在请求头里转发给应用:

Nginx
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

应用这边读取这些请求头。很多框架有专门的设置,比如 Express 的 app.set("trust proxy", 1),设置后 req.ip 就是真实 IP。

如果 Nginx 前面还有 CDN,$remote_addr 拿到的是 CDN 节点的地址。这时要用 realip 模块,从 CDN 传来的请求头里取出用户 IP:

Nginx
set_real_ip_from 10.0.0.0/8;   # 换成 CDN 公布的回源 IP 段
real_ip_header X-Forwarded-For;
real_ip_recursive on;

注意安全:X-Forwarded-For 可以被客户端伪造,只能信任来自你自己的代理或 CDN 的那部分。不要直接拿请求里原始的 X-Forwarded-For 做限流或者风控判断。

0 条回复

A文章作者M管理员
上传评论图片

暂无讨论,说说你的看法吧