跳到主要内容

Nginx 如何获取客户端的真实IP?

参考答案:

在 Nginx 中,获取客户端的真实 IP 地址通常涉及检查 $remote_addr 变量。但是,如果请求经过了一些代理服务器,例如负载均衡器或者 CDN,$remote_addr 可能显示的是代理服务器的 IP 地址,而不是最终用户的 IP 地址。

为了解决这个问题,你可以检查 X-Forwarded-ForX-Real-IP 或其他类似的 HTTP 头,这些头通常由代理服务器添加,并包含最终用户的 IP 地址。

以下是一些步骤和配置示例,帮助你获取客户端的真实 IP 地址:

  1. 检查 $remote_addr

默认情况下,Nginx 的 $remote_addr 变量包含发出请求的客户端的 IP 地址。如果请求没有经过代理,这将是最终用户的真实 IP 地址。

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

在上面的 log_format 示例中,$remote_addr 用于记录请求的 IP 地址,而 $http_x_forwarded_for 用于记录 X-Forwarded-For 头的值(如果存在的话)。 2. 配置 real_ip_headerset_real_ip_from

如果你的 Nginx 服务器位于一个或多个代理服务器之后,你可以使用 real_ip_headerset_real_ip_from 指令来告诉 Nginx 从哪个头获取真实 IP 地址,并指定哪些 IP 地址或网络是可信的代理。

例如,如果你的 Nginx 服务器后面有一个负载均衡器,其 IP 地址是 192.168.1.1,你可以这样配置:

http {
    ...
    set_real_ip_from   192.168.1.1;
    real_ip_header     X-Forwarded-For;
    ...
}

这样,Nginx 会从 X-Forwarded-For 头中获取 IP 地址,并认为这个地址是最终用户的真实 IP 地址,只要请求是从 192.168.1.1 这个可信的代理发出的。 3. 注意安全性

当你配置 Nginx 以信任 X-Forwarded-For 或其他类似头时,要非常小心。只信任你知道且信任的代理服务器的 IP 地址。否则,恶意的客户端可能会伪造这些头,从而伪装成其他 IP 地址。 4. 考虑使用其他模块

除了上述方法外,还有一些第三方模块(如 ngx_http_realip_module 的增强版)可以提供更复杂的 IP 信任和解析功能。根据你的具体需求和环境,你可能想要考虑这些模块。 5. 测试和验证

配置完成后,确保通过发送测试请求并检查 Nginx 的访问日志来验证你的配置是否正确。你可以使用 curl 或其他工具从多个源(包括直接和通过代理)发送请求,并检查日志中的 IP 地址是否正确。