你的配置存在几个关键问题,导致 remote_addr
没有正确传递给上游服务器。以下是具体分析和解决方案:
问题原因
错误的头部命名方式
- 你试图用
proxy_set_header remote_addr $remote_addr;
传递客户端 IP,但:- HTTP 标准头部通常使用连字符(如
X-Real-IP
),而非下划线。 - 自定义头部(如
remote_addr
)可能被后端服务忽略或无法解析。
- HTTP 标准头部通常使用连字符(如
- 你试图用
host
头被覆盖proxy_set_header host $remote_addr;
错误地将Host
头改成了客户端 IP,这会导致:- HTTPS 请求的 SNI(Server Name Indication)失效,可能触发 SSL/TLS 握手失败。
- 上游服务器无法识别原始域名请求。
作用域冲突
- 如果
proxy_set_header remote_addr $remote_addr;
定义在http/server
块但未在location
中重新声明,可能会被默认配置覆盖。
- 如果
修正方案
✅ 正确配置(推荐)
location / {
proxy_pass https://www.xxx.com;
# ✅ 标准化传递客户端IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ✅ 保留原始Host头(关键!)
proxy_set_header Host www.xxx.com;
# ✅ HTTPS代理需关闭证书验证(仅测试环境)
proxy_ssl_verify off;
}
关键解释
标准化头部
X-Real-IP
: 直接传递客户端真实 IP。X-Forwarded-For
: 记录所有代理节点的 IP(格式:client, proxy1, proxy2
)。
修复
Host
头Host: www.xxx.com
:确保上游服务器能识别原始域名请求,避免 HTTPS/SNI 问题。
调试方法
- 检查实际发送的请求头:
curl -vk http://your-nginx-server/ --header "Host: www.xxx.com"
- Nginx日志监控:
在日志格式中添加
$http_x_real_ip
、$http_host
。
- 检查实际发送的请求头:
❌ 常见误区
自定义头部无效?
- NGINX默认不会转发带下划线的头部(如
remote_addr
),需显式启用:
但仍建议使用标准头部(如underscores_in_headers on;
X-Real-IP
)。
- NGINX默认不会转发带下划线的头部(如
为什么HTTPS代理失败?
- 如果上游服务器启用了SNI,错误的
Host
头会导致 TLS握手失败。必须保留原始域名!
- 如果上游服务器启用了SNI,错误的
📌 总结
你的配置主要因以下原因失败:
非标准头部→改用X-Real-IP
覆盖了关键Host头→固定为上游域名作用域优先级→在location内显式设置
按修正方案调整后即可正常传递客户端 IP。
内容由零声教学AI助手提供,问题来源于学员提问