Nginx 如何获取客户端的真实IP?
在 Nginx 中,获取客户端的真实 IP 地址通常涉及检查 $remote_addr
变量。但是,如果请求经过了一些代理服务器,例如负载均衡器或者 CDN,$remote_addr
可能显示的是代理服务器的 IP 地址,而不是最终用户的 IP 地址。
为了解决这个问题,你可以检查 X-Forwarded-For
、X-Real-IP
或其他类似的 HTTP 头,这些头通常由代理服务器添加,并包含最终用户的 IP 地址。
以下是一些步骤和配置示例,帮助你获取客户端的真实 IP 地址:
- 检查
$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_header
和 set_real_ip_from
:
如果你的 Nginx 服务器位于一个或多个代理服务器之后,你可以使用 real_ip_header
和 set_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 地址是否正确。