在 Nginx 转发请求至上游服务器时,默认情况下,上游服务器看到的客户端 IP 地址是 Nginx 服务器的 IP 地址,而不是实际客户端的 IP 地址。这是因为 Nginx 作为反向代理,接收来自客户端的请求后,再将其转发到上游服务器。
获取客户端真实 IP
为了让上游服务器能够获取真实的客户端 IP,Nginx 提供了几种方式。最常用的方法是使用 X-Real-IP
和 X-Forwarded-For
HTTP 头。以下是如何配置以确保上游服务器接收到正确的客户端 IP 地址:
- 使用
proxy_set_header
配置:
在你的 Nginx 配置中,可以添加以下行来传递真实客户端 IP 给上游服务器:
location / {
proxy_pass http://upstream_server;
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
: 表示原始请求中的客户端地址。$proxy_add_x_forwarded_for
: 会将当前客户端的 IP 添加到X-Forwarded-For
头中,如果已经存在,则会保留之前的信息,并在其后附加新的 IP。
- 在上游服务器中处理这些头信息:
上游应用(如 Web 应用、API 等)需要处理 X-Real-IP
和 X-Forwarded-For
头,以获取真实的客户端地址。
注意事项
安全性:由于这些 HTTP 头可以被伪造,因此在信任这些头信息之前,你应该确认只允许可信来源(如负载均衡器或反向代理)来传递它们。
多级代理:如果你有多个层次的代理(例如,一个 CDN 前面还有一个反向代理),你可能还需要考虑如何管理这些层次中的每一个。
IP 植入与私有网络:如果 Nginx 与上游之间是在同一网络内,且没有外部访问,请求仍然会经过 Nginx,但实际上可能会显示内部地址而非公共地址。
通过适当配置和理解这些机制,可以有效地获取并利用客户机的真实 IP 信息。
内容由零声教学AI助手提供,问题来源于学员提问