Nginx需通过proxy_set_header显式透传X-Real-IP、X-Forwarded-For、X-Forwarded-Proto等头,配合set_real_ip_from和real_ip_header配置可信代理范围,才能确保后端获取真实客户端IP及协议信息。

Nginx 通过 proxy_set_header 指令,可以在将请求转发给后端服务器(如 FastAPI、Node.js、Tomcat 等)前,修改或添加 HTTP 请求头。这是反向代理中控制请求上下文的关键配置,直接影响后端服务对客户端真实信息的识别。
常见需要设置的请求头及作用
默认情况下,Nginx 会清除部分原始请求头(如 Connection),并重置一些关键字段。为让后端正确获取客户端真实 IP、协议类型等信息,需显式设置:
-
X-Real-IP:设为
$remote_addr,传递客户端真实 IP(适用于直连或单层代理) -
X-Forwarded-For:追加
$proxy_add_x_forwarded_for,保留完整代理链路 IP(支持多级代理) -
X-Forwarded-Proto:设为
$scheme,告知后端原始请求是http还是https -
X-Forwarded-Host:设为
$host,传递原始 Host 头,避免后端生成错误跳转链接 -
Host:通常设为
$host或后端服务所需域名,确保后端路由匹配
基本 proxy_set_header 配置示例
在 location 块中配置,优先级高于 server 或 http 级别:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
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;
proxy_set_header X-Forwarded-Host $host;
}注意:$proxy_add_x_forwarded_for 是 Nginx 内置变量,会在原有 X-Forwarded-For 值后追加 $remote_addr,避免覆盖上游代理信息。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
覆盖或清除默认头信息
Nginx 默认会发送 Connection: close 和清空 Accept-Encoding,若需透传压缩或保持长连接,可显式设置:
- 用
proxy_set_header Connection '';清空该头(允许 Keep-Alive) - 用
proxy_set_header Accept-Encoding $http_accept_encoding;透传客户端支持的压缩方式 - 用
proxy_hide_header X-Powered-By;隐藏后端返回的敏感头
若某请求头不希望发往后端,可设为空字符串:proxy_set_header User-Agent "";
调试与验证技巧
配置生效后,可通过以下方式确认头是否正确传递:
- 在后端服务中打印所有请求头(如 Python 的
request.headers,Node.js 的req.headers) - 用 curl 模拟请求并查看 Nginx access log:
log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; - 检查 Nginx 配置语法:
nginx -t,重载:nginx -s reload
特别注意:如果前端还经过 CDN 或其他代理,X-Forwarded-For 可能含多个 IP,后端需取最左或可信段,而非直接信任第一个。

















