nginx获取客户端真实ip
背景:
公司所有的域名都是通过F5机器设置,其用户请求也都是通过F5转发,项目某些请求需要限制访问,加上运维没有配置F5透传ip功能,故准备在nginx上配置reaIp模块,获取用户真实的ip。
F5代理转发,或者CDN代理转发之后的请求,获取到的ip一般都是F5的或者CDN的ip地址,其真实ip往往隐藏在请求中。
1,配置realIP模块
默认不会编辑进Nginx
通过--with-http_realip_module启用功能
2,指令解释
Syntax: set_real_ip_from address | CIDR | unix:;
Default: —
Context: http, server, location
#set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
Syntax: real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default: real_ip_header X-Real-IP;
Context: http, server, location
#real_ip_header:从哪个header头检索出要的IP地址
Syntax: real_ip_recursive on | off;
Default: real_ip_recursive off;
Context: http, server, location
#real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。
3,透传ip到服务器上
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip
4,具体nginx的配置
set_real_ip_from 10.10.1.1;
set_real_ip_from 10.10.1.2;
set_real_ip_from 10.10.1.3;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location /rest {
allow 1.1.1.1;
allow 2.2.2.2;
deny all;
proxy_pass http://ecs-rest;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;#允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;#后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;#连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}