DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Nginx real_ip 后日志仍是代理 IP,检查 remote_addr 求值时机

realip规则只在location中生效而remote_addr更早被读取时,日志可能使用旧缓存;检查作用域及原连接地址变量。

Nginx 已配置可信代理和 real_ip_header,请求头里也有正确客户端地址,访问日志中的 $remote_addr 却仍是代理 IP。如果 realip 规则放在 location 中,而配置更早已经读取过 $remote_addr,需要检查变量首次求值的时机。

$remote_addr 的值会在首次读取后缓存。先取得代理连接地址,再由 realip 修改连接地址,后续日志仍可能读到旧缓存。此时不能只从日志推断 realip 完全没有工作,也不能靠扩大可信网段来修复。

找到第一次读取 remote_addr 的位置

先核对实际加载的配置,包括 include 中的片段。下面展示容易触发这条路径的结构,代理地址使用文档示例值:

server {
    set $saved_addr $remote_addr;

    location / {
        set_real_ip_from 192.0.2.10/32;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
    }
}

server 层的 rewrite 指令可以在选定 location 之前读取变量;只配置在 location 里的 realip 此时还没有机会改地址。set、rewrite 表达式或其他会访问变量的配置,都需要按实际执行阶段检查。配置文件里写在上面或下面,并不等于运行时先后顺序。

这类缓存行为曾在不同 Nginx 版本中出现,不足以证明某个升级版本破坏了地址恢复。当前实现仍会缓存 $remote_addr;先检查配置作用域与求值时机,再判断发行版模块或其他差异。

让可信地址规则在早期读取前生效

若同一个站点确实采用一致的代理入口和地址头,可以把规则配置在 server 层,使连接地址在更早阶段被更新:

server {
    set_real_ip_from 192.0.2.10/32;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    location / {
        # 保留已有处理指令
    }
}

该片段只解释配置位置,不是完整站点。地址必须换成真正受控、会正确清理和传递客户端地址的代理。多入口使用不同信任规则时,不能机械提升到整个 http 上下文;先判断扩大作用域会影响哪些站点和访问规则。

同时检查 location 中是否另有覆盖项,以及 $remote_addr 是否仍被更早模块读取。不要把保存旧地址的 set 移来移去作为长期方案,Nginx 已提供专门保留原连接地址的变量。

原连接地址使用 realip_remote_addr

$realip_remote_addr 从 Nginx 1.9.7 起保留原始连接地址。日志需要同时保存访客地址与代理入口时,可在 http 上下文定义专用格式,再在需要的站点应用:

log_format client_path 'client=$remote_addr peer=$realip_remote_addr '
                       'xff="$http_x_forwarded_for" "$request" $status';

这只是格式片段,实际 access_log 的路径和格式名应合入现有配置。转发头可能包含访客提供的内容;记录它便于核对链路,不代表头中的每个地址都可信。日志还需遵守既有访问权限和保留策略。

realip 模块并非默认编译启用,需核对 nginx -V 与实际安装模块。旧版本不具备某个变量时,应按版本支持处理,不能为了保留原地址而故意提前缓存 $remote_addr。

再核对可信链,避免把两类问题混在一起

如果真实连接对端不在 set_real_ip_from 中,或者上游没有传递预期的头,修改求值时机也无效。默认关闭递归搜索时,可信入口使用头中的最后一个地址;启用 real_ip_recursive 时,会在相应可信链条件下寻找最后一个非可信地址。

只信任实际代理地址与必要网段,不使用 0.0.0.0/0、::/0 来让显示“正确”。可直接访问源站的客户端若能自填头改变地址,后续日志、限流或访问规则就可能使用伪造身份。

修改前保存配置,检查后受控重载。用同一代理入口重复原请求,核对访客地址、原连接地址和实际访问规则;再验证不受信任入口携带伪造头时不能改变可信身份。若异常,恢复本次作用域和日志调整,保留能够说明首次求值位置的配置与诊断记录。