nginx启用realip模块获取cdn真实ip需三步:确认已编译(nginx -v | grep with-http-realip-module)、配置可信代理网段与头字段(set_real_ip_from/real_ip_header/real_ip_recursive)、验证$remote_addr是否为真实ip(日志或/debug/ip测试)。

Linux 下 Nginx 启用 realip 模块获取 CDN 真实客户端 IP,核心是三步:确认模块已编译、配置可信代理与头字段、验证替换生效。重点不在“装”,而在“信谁、从哪取、怎么判”。
确认 realip 模块已启用
该模块默认包含在官方 nginx.org 包、主流发行版(如 Ubuntu 的 nginx-full、CentOS Stream 的 nginx)及 OpenResty 中。执行以下命令检查:
- nginx -V 2>&1 | grep -o with-http-realip-module —— 若输出该字符串,说明已支持;
- 若无输出,需重新编译 Nginx,configure 时加上 --with-http-realip-module;
- 不建议单独“安装模块”,realip 是编译期特性,非运行时动态模块。
配置可信代理和真实 IP 来源头
CDN 节点是你的上一级可信代理,必须明确列出其 IP 或网段。以阿里云 DCDN、Cloudflare、腾讯云 CDN 等常见场景为例:
- 在 http 块中添加(不可放在 event 或 stream 块):
set_real_ip_from 100.64.0.0/10; # 阿里云 DCDN 回源网段
set_real_ip_from 173.245.48.0/20; # Cloudflare IPv4 网段
set_real_ip_from 2405:8100::/32; # Cloudflare IPv6 网段
real_ip_header X-Forwarded-For; # 大多数 CDN 默认用此头
real_ip_recursive on;
- real_ip_recursive on 很关键:它让 Nginx 在 X-Forwarded-For 多个 IP 中,从右往左跳过所有 set_real_ip_from 列出的地址,取第一个“非可信”的 IP 作为真实客户端 IP;
- 若 CDN 直接透传 ali-cdn-real-ip(如阿里云 DCDN),可改用:
real_ip_header ali-cdn-real-ip; —— 更简洁、不易被伪造。
验证真实 IP 是否写入 $remote_addr
配置生效后,$remote_addr 就是用户真实 IP,后续所有模块(日志、limit_req、geo、if)都可直接使用:
- 修改 log_format,加入 $remote_addr,重启 Nginx 后查看 access.log,确认显示的是公网用户 IP,而非 CDN 节点 IP;
- 临时加一个测试 location:
location /debug/ip { return 200 "Real IP: $remote_addr\n"; }
用 curl 访问,结果应为用户真实出口 IP; - 注意:仅当请求来源 IP 在 set_real_ip_from 白名单中时,替换才触发;直连 Nginx 的请求不受影响,$remote_addr 保持原值。
补充:保留 CDN 节点 IP 用于排障
有时需要同时记录用户真实 IP 和 CDN 节点 IP(比如排查回源异常):
- 启用 realip 后,原始连接 IP 可通过变量 $realip_remote_addr 获取;
- 在日志中同时记录:
log_format full '[$time_local] $remote_addr($realip_remote_addr) "$request" $status';











