Nginx反向代理及获取真实的客户端IP地址
在使用Nginx作为反向代理服务器时,获取客户端的真实IP地址是一个常见的需求。由于经过代理后,请求到达Nginx的实际IP是代理服务器的地址,因此需要通过特定的配置来获取原始请求中的客户端IP。
Nginx提供了$remote_addr变量来获取与服务器直接建立TCP连接的客户端真实IP地址。然而,如果客户端通过多个代理或负载均衡器连接到Nginx,$remote_addr将只反映最后一个代理的IP地址。为了获取经过多个代理的真实客户端IP,可以使用以下配置方法 :
设置real_ip_header和set_real_ip_from指令:
real_ip_header:定义Nginx从哪个HTTP头部获取客户端的真实IP地址。通常设置为X-Forwarded-For或X-Real-IP。
set_real_ip_from:定义受信任的代理服务器的IP地址或IP范围,Nginx将从这些代理转发的请求中获取真实IP。
配置示例:
nginx
http {
real_ip_header X-Forwarded-For;
set_real_ip_from 192.0.2.0/24; # 受信任的代理IP段
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
上述配置中,proxy_set_header指令用于设置转发请求时的HTTP头,确保后端服务器能够接收到真实的客户端IP地址。
注意事项:
确保代理服务器或负载均衡器已正确设置,能够在请求头中添加或保留X-Forwarded-For或X-Real-IP。
如果使用CDN服务,需要检查CDN配置,确保它不会移除或修改这些HTTP头部。
后端应用获取真实IP:
在Java应用中,可以通过请求头X-Forwarded-For或X-Real-IP获取客户端的真实IP地址。示例代码如下:
java
public String getClientIP(HttpServletRequest request) {
String ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null) {
ipAddress = request.getHeader("X-Real-IP");
}
return ipAddress;
}
通过这些配置,即使在使用反向代理的情况下,也能够确保获取到客户端的真实IP地址,这对于日志记录、访问控制、速率限制等场景非常重要
文章地址: https://www.nnzv.com/article/113.html