1. 问题背景与核心痛点
最近在帮客户部署一套高并发Web服务时,遇到一个典型的Nginx代理场景:当Nginx作为反向代理转发请求到后端服务时,后端服务日志中记录的客户端IP全部变成了127.0.0.1。这直接导致两个严重问题:
- 审计失效:无法追踪真实用户行为
- 限流失灵:基于IP的限流策略全部作用于127.0.0.1这个本机地址
这种情况在多层代理架构中尤为常见。比如我们当时的架构是:
code复制客户端 → 云厂商SLB → Nginx集群 → 后端服务
经过两层代理后,后端服务完全丢失了原始客户端信息。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. IP传递机制深度解析
2.1 HTTP头部的IP传递标准
在代理转发过程中,规范的做法是通过以下HTTP头传递原始IP信息:
X-Forwarded-For:记录整个代理链的IP路径X-Real-IP:记录最接近客户端的真实IP
以这个访问链为例:
code复制用户(1.1.1.1) → CDN(2.2.2.2) → Nginx(3.3.3.3) → 后端
经过正确配置后,后端服务应该看到:
http复制X-Forwarded-For: 1.1.1.1, 2.2.2.2
X-Real-IP: 1.1.1.1
2.2 Nginx的默认行为问题
Nginx默认配置下:
nginx复制location / {
proxy_pass http://backend;
}
这样简单的转发会导致:
- 自动清空已有的
X-Forwarded-For头 - 后端看到的remote_addr变为Nginx服务器的内网IP
3. 完整解决方案
3.1 基础IP转发配置
在nginx.conf的http或server块中添加:
nginx复制proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
关键参数说明:
$remote_addr:直接上级的TCP连接IP(可能是真实客户端或上一级代理)- `$proxy_add_x_forwarded_for
