生产环境 Nginx 代理端口透传完整指南(含 X-Forwarded 全套配置)
|
admin
2025年12月14日 16:16
本文热度 769
|
location / { proxy_pass http://backend; proxy_set_header Host $http_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-Port $server_port; proxy_set_header X-Forwarded-Host $host;
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection;
proxy_connect_timeout 5s; proxy_read_timeout 60s; proxy_send_timeout 60s; proxy_buffering off;
}
proxy_pass http://backend;
将匹配到的请求转发到名为 backend 的 upstream(或直接是一个上游地址)。
注意 proxy_pass 后面的 URI 行为:
backend 可以在 upstream 定义多个后端服务器,支持负载均衡、权重等。
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
作用:把 X-Real-IP 设为直接连接到 nginx 的客户端 IP($remote_addr)。
场景:后端想快速读取真实客户端 IP(单层代理下),可以直接用这个头。
注意:若有多层代理(client -> CDN -> nginx),$remote_addr 是连接到当前 nginx 的上游 IP(可能是 CDN),此时更可信的链式头是 X-Forwarded-For。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
作用:设置 X-Forwarded-For 为一条由各代理累积的客户端 IP 列表。
$proxy_add_x_forwarded_for 的行为:若上游已有 X-Forwarded-For,会在其后追加 , $remote_addr;否则设置为 $remote_addr。
这允许后端看到完整的代理链(例如 client-ip, proxy1-ip, proxy2-ip)。
推荐:在后端解析时取左侧第一个(最原始的客户端 IP),但需注意信任链(不要信任来自不受控网络的 X-Forwarded-For)。
proxy_set_header X-Forwarded-Proto $scheme;
作用:把请求协议(http 或 https)传给后端。
$scheme 表示客户端与 nginx 之间的协议(如果 nginx 做 TLS 终结,$scheme = https)。
后端可以根据此头生成带 https 的回调 URL 或判断是否需要强制 https 转向。
proxy_set_header X-Forwarded-Port $server_port;
阅读原文:原文链接
该文章在 2025/12/15 9:40:44 编辑过