????????客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用以实现真实客户端 IP 的获取及传递的功能。
????????通过该模块提供的配置指令,用户可以手动设置上层反向代理服务器的 IP 作为授信 IP,Nginx 服务器根据配置指令的配置排除授信 IP,而甄别出真实的客户端 IP 进行日志记录,并传递给上游服务器。模块配置指令如下表所示。
指令名称 | 指令值格式 | 默认值 | 指令说明 |
set_real_ip_from | address 或 CIDR 或 unix | -- | 设置授信 IP,IP 网段或 UNIX 套接字 |
real_ip_header | field 或 X-Real-IP 或 X-For-warded-For 或 proxy_protocol | X-Real-IP | 通过指定的 HTTP 头字段获取真实客户端 IP |
real_ip_recursive | on 或 off | off | 当客户端经多层反向代理到达当前服务器时,指定的 HTTP 头字段中会有多个 IP 地址。默认会以最后一个 IP 为真实客户端 IP,当指令值为 on 时,会以最后一个非信 IP 为真实客户端 IP |
该模块指令使用的指令域范围为http、server、location。配置样例如下:
server {
listen 8088;
access_log logs/proxy.access.log main;
set_real_ip_from 192.168.2.159; # 设置192.168.2.159为授信IP
real_ip_header X-Forwarded-For; # 通过HTTP头字段X-Forwarded-For获取真实客户端IP
real_ip_recursive on; # 以最后一个非授信IP为真实客户端IP
tcp_nodelay off; # 因启用缓冲区功能,所以关闭立刻发送功能
location ~ ^/ {
proxy_force_ranges on; # 强制启用字节范围请求支持
proxy_pass http://192.168.2.145:8082;
break;
}
}