nginx获取真实IP详解

X-Forwarded-For

X-Forwarded-For 是一个 HTTP 扩展头部。如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

X-Real-IP

它的主要作用是告诉后端服务器实际客户端的IP地址,而不是代理服务器的IP地址。

remote_addr

只能获取上一层的ip,有可能是代理ip。

获取真实ip的办法

  1. 使用X-Real-IP方式:
1. 第一层代理设置:
proxy_set_header X-Real-IP $remote_addr;
这会将客户端的真实 IP($remote_addr)存入 X-Real-IP 请求头,传递给后续代理或后端服务器。

2. 中间代理层设置(如果有):
proxy_set_header X-Real-IP $http_x_real_ip;
中间代理会继续传递 X-Real-IP,确保它不会被覆盖,最终到达最后一层 Nginx 或应用。

3. 最后一层Nginx日志配置:
log_format main '$http_x_real_ip - $remote_addr - [$time_local] ...';
这样日志会记录 X-Real-IP(真实客户端 IP)和当前代理的 IP($remote_addr),方便排查问题。

这种配置只影响Nginx日志,应用默认无法自动获取真实 IP,如 PHP、Java、Python 等)默认不会自动解析 X-Real-IP,除非代码主动读取该请求头。
  1. X-Forwarded-For方式:
所有代理层设置 "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;"
可以记住客户端ip以及所有代理的ip,最后一个代理的ip不在X-Forwarded-For中,需要用remote_addr获取,这种方式nginx想要获取真实ip可以设置:
set_real_ip_from 10.0.0.0/24;  # 所信任的代理ip
real_ip_header X-Forwarded-For;
real_ip_recursive on;
来告诉nginx的remote_addr取X-Forwarded-For的第一个ip为真实ip地址。而应用测想要获取真实ip,直接调用X-Forwarded-For相关参数即可
posted @ 2025-08-14 17:51  阿峰博客站  阅读(200)  评论(0)    收藏  举报