Nginx如何将客户端真实IP传递至被代理服务器?
如何让被代理服务器获取客户端真实IP?
嘿,我来帮你解决这个头疼的问题!当Nginx做反向代理时,后端服务器默认拿到的是代理服务器的IP——这是因为代理会把自己作为请求的发起方传给后端。要让后端拿到客户端真实IP,得做两步关键配置:前端代理Nginx转发IP头,后端服务器信任代理并解析这些头。
第一步:前端代理Nginx配置转发真实IP
在代理Nginx的location块(或server块内)添加以下配置,把客户端IP通过请求头发给后端:
location / { proxy_pass http://你的后端服务器地址; # 替换成实际后端地址,比如http://192.168.1.200:80 # 核心:传递真实客户端IP proxy_set_header X-Real-IP $remote_addr; # X-Forwarded-For会包含所有代理链路的IP,$proxy_add_x_forwarded_for会在原有值后追加当前客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 可选但推荐:传递原始请求的Host头,避免后端处理域名问题 proxy_set_header Host $host; }
第二步:后端被代理服务器(Nginx)配置信任代理并解析IP
后端Nginx需要知道哪些IP是可信的代理服务器,这样才会把代理发来的X-Real-IP当成真实客户端IP,而不是直接用默认的$remote_addr(代理的IP)。在后端Nginx的http块里添加:
http { # 这里填写前端代理Nginx的IP或网段,比如代理IP是192.168.1.100,就填这个 set_real_ip_from 192.168.1.100; # 如果是多个代理,可重复添加set_real_ip_from # set_real_ip_from 10.0.0.0/24; # 指定从哪个请求头读取真实IP real_ip_header X-Real-IP; # 可选:如果有多层代理,开启这个会忽略信任IP段里的地址,只保留最外层的客户端IP # real_ip_recursive on; }
第三步:验证配置是否生效
你可以在后端Nginx里加一个测试接口,快速验证IP是否正确传递:
location /check-ip { default_type text/plain; return 200 "当前获取的IP: $remote_addr\nX-Real-IP头内容: $http_x_real_ip\nX-Forwarded-For头内容: $http_x_forwarded_for"; }
重启前后端Nginx服务后,访问http://后端地址/check-ip,如果当前获取的IP显示的是你的真实客户端IP,就说明配置成功啦!
额外注意事项
- 如果后端不是Nginx(比如Apache、Tomcat等),要对应配置读取
X-Real-IP或X-Forwarded-For头。比如Apache需要启用mod_remoteip模块,配置RemoteIPHeader X-Real-IP和RemoteIPTrustedProxy 代理IP。 - 确保代理服务器和后端服务器之间的网络没有其他中间代理篡改这些请求头,否则可能导致IP获取不准确。
内容的提问来源于stack exchange,提问作者Meiram Chuzhenbayev




