1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

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

关注“IT那活儿”公众号,了解更多IT技术

你好,我是本际云服务器推荐网的小编小本本,今天要介绍的是关于nginx获取真实ip并进行hash分配的方法。

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

使用nginx获取真实ip

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

文件共享服务可以使用nfs文件共享,也可以使用文件系统(如:fastdfs)做共享文件,或者通过redis做session共享。另外,我们可以直接通过改动nginx做基于ip的会话保持,这种改动对于生产系统是改动最小、影响最小的。

基于真实ip做hash分配

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

为了解决这个问题,可以在Nginx的http模块内加入以下配置:
map $http_x_forwarded_for $clientRealIp {"" $remote_addr;~^(?P<firstAddr>[0-9.]+),?.* $1;}

而且代码中还配合使用了$remote_addr,因此$clientRealIP还能兼容客户端直接访问nginx代理的情况,不像$http_x_forwarded_for在直接访问模式中将会是空值!同时,在nginx的upstream模块内加入如下配置:
upstream web {hash $clientRealIp;server 192.168.1.100:8080;server 192.168.1.101:8080;}

测试案例

1. 第一层代理:单台nginx

nginx配置如下图所示:test1

2. 第二层代理:两台nginx

nginx配置如下图所示:test2

3. 第三层web服务:三台web服务

测试通过浏览器访问第一台nginx地址加端口,如:http://ip36:8088,通过其它服务器直接curl访问,如:curl http://ip36:8088。

4. 验证

统计两台nginx访问日志,把客户端地址和第三层web服务地址统计输出,发现同一个客户端只会出现在两台nginx访问日志中的其中一台,且也只会分发到后端web服务的其中一台服务器,验证成功。

至此,基于nginx通过X-Forwarded-For获取真实ip并进行hash分配的方法讲解完毕。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6333.html