资讯专栏INFORMATION COLUMN

nginx通过X-Forwarded-For获取真实ip基于真实ip做hash

IT那活儿 / 2647人阅读
nginx通过X-Forwarded-For获取真实ip基于真实ip做hash

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

 

01

场景
因为一次业务会多次访问,但是访问中会产生一些文件和图片,所以后端真实服务需要做会话保持或者做文件共享服务。

02

解决方案
  • 文件共享服务可以使用nfs文件共享,也可以使用文件系统(如:fastdfs)做共享文件。
  • 可以通过redis做session共享。
  • 可以直接通过改动nginx做基于ip的会话保持,这种改动目前对于生产系统是改动最小,影响最小的。

 

03

Nginx解决方案
nginx常用的就是基于ip做hash,但是nginx前面如果还有代理或者套了一层CDN,直接ip_hash是无法均衡分配的,因为nginx会把前一层套的代理地址或CDN地址做hash算法分配给后端服务地址。

3.1 在 Nginx 的 http 模块内加入如下配置:

map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P[0-9.]+),?.*$ $firstAddr;
}
注:而且代码中还配合使用了$remote_addr,因此$clientRealIP 还能兼容客户端直接访问nginx代理的情况,不像$http_x_forwarded_for在直接访问模式中将会是空值!
3.2 在nginx的upstream模块内加入如下配置:
upstream web {
hash $clientRealIp;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}

 

04

测试案列
第一层代理:单台nginx:36
  • nginx配置如下图所示:
第二层代理:两台nginx:37/38
  • 37/38nginx配置如下图所示:
第三层web服务:三台web服务:39/40/41
4.1 测试
  • 通过浏览器访问第一台nginx地址加端口,如:http://ip36:8088
  • 通过其它服务器直接curl访问,如:curl http://ip36:8088
4.2 验证
第二层代理37/38nginx,统计两台nginx访问日志,把客户端地址和第三层web服务地址统计输出,发现同一个客户端只会出现在37/38其中一台nginx访问日志中,且也只会分发到后端web服务一台服务器,验证成功。
  • 37nginx访问日志如图所示:
  • 38nginx访问日志如图所示:



END



本文作者:徐 苗

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129461.html

相关文章

  • 利用X-Forwarded-For伪造客户端IP漏洞成因及防范

    摘要:在有反向代理的情况下,直接使用获取到的地址是所在服务器的地址,而不是客户端的。如何防范方法一在直接对外的反向代理服务器上配置如果有多层代理,内层的配置在最外层即直接对外提供服务的使用代替上面的,可以防止伪造。 问题背景 在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。 如何获取客户端IP 在Java中,获取客...

    Yuqi 评论0 收藏0
  • docker进阶,nginx部署的几个重要点详解以及开发流程---持续更新

    摘要:无论这个连接是外部主动建立的,还是内部建立的。协议有表示层数据的表示安全压缩。在整个发展过程中的所有思想和着重点都以一种称为的文档格式存在。 部署基础知识url:协议://网站地址:端口(/)路径地址?参数eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服务器 80端口:找服务器上提供服务的应用 nginx uri:/ab...

    KunMinX 评论0 收藏0
  • docker进阶,nginx部署的几个重要点详解以及开发流程---持续更新

    摘要:无论这个连接是外部主动建立的,还是内部建立的。协议有表示层数据的表示安全压缩。在整个发展过程中的所有思想和着重点都以一种称为的文档格式存在。 部署基础知识url:协议://网站地址:端口(/)路径地址?参数eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服务器 80端口:找服务器上提供服务的应用 nginx uri:/ab...

    ytwman 评论0 收藏0
  • nginx配置解析之客户端真实IP的传递

    摘要:前后端分离之后,采用作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实的获取。 前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取。 在一些特殊场景下,比如风控和支付流程,往往需要获取用户的ip信息,但是nginx反向代理在实现跨域...

    Lsnsh 评论0 收藏0
  • 干货:Java正确获取客户端真实IP方法整理

    摘要:但是在通过了,等反向代理软件就不能获取到客户端的真实地址了。下面是一个参考获取客户端地址的方法如果使用的是连接池,可以参考使用方法,但这个是经过多级代理的地址,需要自己处理下获取第一个。 showImg(https://segmentfault.com/img/remote/1460000015379119); 在JSP里,获取客户端的IP地址的方法是:request.getRemot...

    felix0913 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<