Skip to content

引言

在使用网上找到的 NGINX 反向代理配置时,我发现获取的客户端 IP 地址总是显示为 127.0.0.1。本文将详细探讨这一问题的成因,并提供有效的解决方法。

目录

  1. 引言
  2. 案例分析
  3. 原因
  4. 结论
  5. 参考资料

案例分析

  • 网上抄的配置:结果拿到的客户端IP是 127.0.0.1
txt
        location /api {
                proxy_pass http://127.0.0.1:8088/v2-api; 
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
  • 修改后的配置:拿到的客户端真实IP
txt
        location /api {
                proxy_pass http://127.0.0.1:8088/v2-api;
                proxy_set_header Host $host;
                # 注释了这一行
                # proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

原因

  • remote_addr(AI解释)

当Nginx前面有代理服务器(如负载均衡器、CDN等)时,客户端的请求首先到达代理服务器,然后由代理服务器转发到Nginx。在这种情况下,Nginx看到的 remote_addr 是代理服务器的IP地址,而不是客户端的真实IP地址。

结论

上述修改虽然注释了X-Real-IP,但实际上是去掉remote_addr,让代码能获取到proxy_add_x_forwarded_for的值,这也是在看过Solon框架的源码发现的

java
        String ip = ctx.header("X-Real-IP");
        if (Utils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = ctx.headerOrDefault("X-Forwarded-For", "");
            if (ip.contains(",")) {
                ip = ip.split(",")[0];
            }
        }

实际上配置为 proxy_set_header X-Real-IP $proxy_add_x_forwarded_for; 也是一样

参考资料