获取用户的真实IP后端
Nginx会将客户端的IP信息存放在$remote_addr变量里,但这并不意味着它就是客户端的IP,生产环境每每会充满各类代理,让IP的前因后果变得扑朔迷离。架构
目前互联网公司基本上都采用这种架构方式:代理
用户的请求并非直接和Nginx交互,而是经过了CDN加速平台。默认状况下,Nginx看到的$remote_addr是CDN的IP,这对日志的记录和分析,还有后端的业务逻辑均可能产生不良的影响,若是须要获取到用户的真实IP呢,这个时候realip模块就起到了做用。日志
此模块须要编译时开启:递归
--with-http_realip_moduleip
在Nginx的HTTP块里面配置:rem
set_real_ip_from CDN_IP;it
real_ip_header X-Forwarded-For;io
real_ip_recursive on;编译
set_real_ip_from:
设置哪些IP是可信任的,从这些IP进行获取请求头信息,这些IP就配置为CDN的IP白名单。
real_ip_header:
定义从哪一个请求头获取IP信息,其值将用于替换客户端地址。通常都使用X-Forwarded-For。
real_ip_recursive:
若是启用递归搜索,将会对可信任的IP匹配,原始客户端地址将替换为在请求头域中发送的最后一个不可信地址。若是禁用递归搜索,则从白名单中由real_ip_header指令定义的请求头中的最后一个地址替换。
经过此方式就能够获取到CDN传递给Nginx的用户的IP。那么问题来了,$remote_addr被替换成了用户的IP,有些时候咱们也但愿获取到CDN 的节点IP,这对于排查一些和CDN有关的问题是由帮助的。能够使用$realip_remote_addr,它能够保留原始客户端地址。 (1.9.7版本新增的变量)