nginx正确解析aws nlb等proxy protocol负载均衡器透传的真实ip,需三步协同:nlb启用proxy protocol v2、nginx监听时加proxy_protocol指令、http块中配置set_real_ip_from、real_ip_header proxy_protocol和real_ip_recursive on。

要让 Nginx 正确解析经 AWS ELB(尤其是 NLB)或兼容 PROXY Protocol 的传统负载均衡器转发的、带 TLS 的流量,关键不是“Nginx 解析 TLS”,而是确保:Nginx 在 TCP 层接收并信任 PROXY Protocol 头,同时将真实客户端 IP 透传给上游应用(如后端服务或日志系统),且不干扰 TLS 终止逻辑。TLS 通常由 NLB 终止(或直通),Nginx 本身是否处理 TLS 取决于部署模式。
确认负载均衡器已启用 PROXY Protocol v2
这是前提。若 NLB 或其他四层 LB 没开启该协议,Nginx 收到的只是普通 TCP 连接,无法获取原始客户端 IP。
- AWS NLB:在目标组(Target Group)设置中启用 Proxy protocol version 2(控制台或 CLI 均支持)
- 非 AWS 环境(如 HAProxy、自建 LVS+keepalived):需显式配置
send-proxy-v2或等效指令到 backend server 行 - 注意:ALB 不支持 PROXY Protocol;它用
X-Forwarded-For,与本文场景无关
Nginx 需监听并解析 PROXY Protocol(TCP 层)
Nginx 必须在 stream 块(四层)或 server 块(七层 HTTP/HTTPS)中启用 proxy_protocol 指令,否则会把 PROXY header 当作非法请求直接拒绝或丢弃。
抓取品牌/产品的视觉规范并生成 brand-spec.md。采用五步流程:询问、搜索、下载、验证+提取、编码,输出可直接被 huo15-openclaw-frontend-design 引用的品牌规约。触发词:抓品牌规范、提取品牌、品牌资产、br...
- 若 NLB 终止 TLS(即 NLB 做 HTTPS → HTTP 转发):Nginx 使用
http上下文,在server块中添加listen 80 proxy_protocol;或listen 443 ssl proxy_protocol; - 若 NLB 直通 TLS(即 TCP 直转,TLS 由 Nginx 终止):仍用
http块,但listen 443 ssl proxy_protocol;是标准写法 - 若 NLB 直通非 HTTPS 流量(如 TCP 服务、gRPC、WebSocket over TLS),必须使用
stream块,并配置listen 443 proxy_protocol;
信任来源 IP 并提取真实客户端地址
仅启用 proxy_protocol 不够——Nginx 还需知道哪些连接方(即 NLB 节点)发送的 PROXY header 是可信的,否则会忽略或报错。
- 在
http块中,添加: set_real_ip_from 后跟 NLB 所在 VPC 的 CIDR(如10.0.0.0/8或更精确的子网段) - 指定 header 来源为 PROXY 协议:real_ip_header proxy_protocol;
- 启用递归解析(推荐):real_ip_recursive on;(避免多层代理时取错 IP)
- 验证效果:在
log_format中使用$remote_addr,它此时应显示客户端真实 IP,而非 NLB 私网 IP
配合 Ingress-Nginx 控制器(K8s 场景)的特殊要点
如果你用的是 Kubernetes + ingress-nginx,不能只改 Nginx 配置文件,而要通过声明式方式注入:
- Service 注解中启用 NLB PROXY Protocol:
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*" - Ingress-Nginx ConfigMap 中启用解析:
use-proxy-protocol: "true"、real-ip-header: "proxy_protocol"、real-ip-recursive: "true" - 确保控制器 Pod 的容器启动参数未覆盖这些设置(例如避免
--set-real-ip-from冲突) - 注意:Ingress-Nginx 默认监听 80/443,若你额外暴露其他端口(如 8443),需同步在 Service 和 ConfigMap 中声明










