nginx获取代理服务ip及客户端真实ip

一、问题背景
  在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用 request.getRemoteAddr() 就可以获取到客户端ip,但是当我们使用了nginx 作为反向代理后,使用 request.getRemoteAddr() 获取到的就一直是nginx 服务器的ip的地址,那这时应该怎么办?

首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信息一般都是存储在请求头里的。如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置X-Real-IP和X-Forwarded-For请求头:

二、proxy_set_header 语法
  语法:

proxy_set_header field value;

允许重新定义或者添加发往后端服务器的请求头,value可以包含文本、变量或者它们的组合。当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。

在 java端,需要获取proxy_set_header的参数时,需要使用request.getHeader(field),一般用来获取真实ip地址。

总结:proxy_set_header 就是可设置请求头,并将头信息传递到服务器端。不属于请求头的参数中也需要传递时重定义下就行啦。

三、X-Real-IP
在《实战nginx》中,有这么一句话:

经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。

这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取 r e m o t e a d d r ) , 取 得 的 是 n g i n x 的 地 址 , 即 remote_addr),取得的是nginx的地址,即 remoteaddrnginxremote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的。

但是 nginx 是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx里作一个赋值操作,即我在上面的配置:

proxy_set_header X-Real-IP r e m o t e a d d r ; remote_addr;    remoteaddr;  remote_addr 只能获取到与服务器本身直连的上层请求ip,所以设置$remote_addr一般都是设置第一个代理上面。当一个请求通过多个代理服务器时,用户的IP将会被代理服务器IP覆盖

// 在第一个代理服务器中设置
set x_real_ip=$remote_addr
// 最后一个代理服务器中获取
$x_real_ip=IP1

但是问题是,有时候是通过 cdn 访问过来的,那么后面web服务器获取到的永远都是 cdn 的 ip 而非真实用户 ip。那么这个时候就要用到X-Forwarded-For —— 这个变量的意思其实就像是链路反追踪,从客户的真实ip为起点,穿过多层级的proxy ,最终到达web 服务器,都会记录下来,所以在获取用户真实ip的时候,一般就可以设置成

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这样就能获取所有的代理 ip 和客户 ip。

四、X-Forwarded-For
  X-Forwarded-For 变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是 client1,proxy1,proxy2,以逗号隔开各个地址,由于它是非rfc标准,所以默认是没有的,需要强制添加。

在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for到X…proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

五、KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for又是…proxy_add_x_forwarded_for变量包含客户端请求头中的 X-Forwarded-For 与 $remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.***.com 即用户访问该web通过两台 nginx。

在第一台 nginx 中使用:proxy_set_header X-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for;,…proxy_add_x_forwarded_for变量的X-Forwarded-For部分是空的,所以只有 r e m o t e a d d r , 而 remote_addr,而 remoteaddrremote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用:proxy_set_header X-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for;,…proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

总结:获取客户端的IP地址不仅可以通过proxy_set_header X-real-ip $remote_addr;获取到,也可以通过proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
示例如下:
1、配置localtion

        location /api {limit_req zone=allipse burst=24000 nodelay;add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Headers' 'x-requested-with,content-type';proxy_pass http://api;proxy_set_header   Host    $host;proxy_set_header   Remote_Addr    $remote_addr;proxy_set_header   X-Real-IP    $remote_addr;proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;}

2、添加log配置

log_format  main  '客户端真实ip: $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$geoip2_data_country_code" "$geoip2_data_country_name" "$geoip2_data_city_name" "$upstream_addr" "$request_time" "$upstream_response_time"';

3、查询日志输出
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71927.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用国内代理ip?

现在市面上有很多代理ip,功能多种多样,五花八门的产品让用户挑花了眼,下面是购买代理IP时应该是注意的几点。 代理IP类型代理IP分为多种类型,按照匿名度区可分为透明代理、普通代理、高匿代理;按照用途可分为HTTP代理…

获取客户端IP地址(nginx代理)

需求 对接支付系统的时候, 需要传入 付款方,也就是客户端的IP地址 现象 客户端的请求走我们的 nginx 代理了, 获取到的客户端ip地址不对, 变成了 nginx 服务器的地址了 data 的值是nginx服务器的地址, 这样很明显不对 没有加之前的配置 解决方案 在 nginx 的配置里面加上…

代理ip

proxies有两种协议,http 和 https,访问http协议的网页,需要将代理设置成http,https 也是如此,如果设置错误,仍会使用你自己的IP地址。 https://icanhazip.com/ 这个链接可以查看你访问这个网页所使用的的I…

ip代理

为什么会出现IP被封 网站为了防止被爬取,会有反爬机制,对于同一个IP地址的大量同类型的访问,会封锁IP,过一段时间后,才能继续访问 如何应对IP被封的问题 有几种套路: 修改请求头,模拟浏览器…

测试一下博弈Ai能不能让你成为一个出色的服装设计师

笔者也不是专业的设计人员,就是突发奇想,看看怎么利用博弈AI的设计一款自己风格的衣服。 首先我们打开博弈AI的官网,链接:博弈Ai-基于ChatGPT4及3.5的智能聊天机器人国产镜像 我们把自己的创意和要求提交给博弈AI,就得…

传统企业如何面对电子商务的发展

传统企业如何面对电子商务的发展 在现代生活中,人们对电子商务已经不再陌生。但是随着在电子商务的快速发展,传统零售企业的生存环境变得更加困难,不但面临着上游原材料价格飞涨的困扰,还受到下游渠道商、零售商、品牌商的多重挤…

2022跨境电商新战场:海外社交电商发展前景分析

社交电商正在慢慢改变人们的购物习惯。最近几年,国内由于疫情和电商平台流量红利减少的影响,出现了一批已抖音、快手为代表的社交电商,且迅速大火。随着TikTok在海外的不断布局,社交电商模式的影响力也在不断扩大。作为Nox聚星的营…

电子商务时代,企业社交电商转型要做什么?

当前,全球经济一体化已经成为一种趋势,电商企业的出现也迅速改变了传统的经济交易方式和经济的形式,进一步促进了经济结构的重组及调整,推动了工业经济快速向信息经济转换。 电子商务的诞生给世界经济发展带来了新的推动力,并且给企业创造了新的商业机遇,企业可以提…

盘点两个神器,快速告别垃圾短信邮件

前言 在日常生活中,我们时常会接收到一些垃圾短信和邮件,造成这种原因就是因为我们使用自己的手机号码在 App 上 注册了账号,导致手机号泄露,成为了别人发财的工具。 一、如何避免接收垃圾短信 众所周知,针对短信和…

使用 ChatGPT、Stable Diffusion、React 和 NodeJS 构建网站画廊

TLDR 在本文中,您将学习如何构建一个 Web 应用程序,该应用程序使用 ChatGPT 和 Stable Diffusion 为您提供的任何网站描述生成徽标和合适的域名。 介绍 人工智能正在接管世界。这些技术每天都在震撼着我们的世界:ChatGPT 和 Stable Diffusion…

工业富联2018年报来了!上市后首张成绩单大起底

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。 未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云…

工业富联上半年实现营收1705亿元 云服务设备营收同比增15%

【TechWeb】8月14日消息,上交所上市公司工业富联昨晚发布了2019年半年度报告。报告显示,工业富联上半年实现营收1705亿元。 图片来自工业富联财报 工业富联称,2019 年上半年,公司实现营业总收入 1,705.08 亿元,同比增长…

工业互联网:制造业的二次升级

1.工业互联网的概念及发展历史 工业互联网的概念出现时间并不长,最早可追溯至2012年GE发布的工业互联网白皮书。GE 在白皮书中对工业互联网的定义为“打破智慧和机器的边界“(英文原文为 Industrial Internet: Pushing the Boundaries of Minds and Mach…

工业互联网赋能提速,平台要竞争还是生态?

随着数字化转型的深入,国内制造业产业转型升级的需求日渐升级,工业互联网作为新基建七大领域之一正迎来巨大的发展潜力。据工信部数据显示,截止今年第一季度,全国具有一定行业区域影响力的工业互联网平台已超过100个;2…

工业互联网平台TOP15发布!附15个平台详细介绍!

2019年8月,工信部公示了十大国家级“跨行业跨领域工业互联网平台”。2020年,工信部再次发布2020双跨工业互联网平台名单,仅一年的时间,双跨平台清单再增五家。 清单包括海尔、航天云网、东方国信、徐工、树根互联、用友、阿里云、浪潮云、华为…

郭台铭的工业互联网野心有多大?

文章经授权转载自中国电子报(ID:cena1984) 鸿海富士康科技集团总裁郭台铭即将在10月8日迎来68岁生日,已经拥有了排名全球500强第24位的鸿海富士康(2018年《财富》500强全球企业排名中鸿海精密排名第24位)&a…

现有工业物联网数据管理系统的部分解决方案

目录 1、工业互联网体系架构 2、工业互联网平台的特征 3、参与工业互联网建设的公司 3.1 国内工业互联网平台 3.2 国外工业互联网平台 参考文献 1、工业互联网体系架构 纵向看,工业互联网包括三大体系:网络体系是基础,用于互联互通&am…

要做中国的GE,富士康工业互联网做得怎么样?

中国软件网 出品 作者 赵满满 1 转型先改名 2015年,鸿海精密决定转型“工业互联网”,2018年鸿海精密把富士康改名为工业富联(富士康工业互联网)在上海A股挂牌上市。 名字改得好不好不知道,开盘时的5000多亿市值&#x…

工业互联网产业链全景图深度分析

工业互联网领域有哪些投资机会? “新基建”是与传统基建相对应,结合新一轮科技革命和产业变革特征,面向国家战略需求,为经济社会的创新、协调、绿色、开放、共享发展提供底层支撑的具有乘数效应的战略性、网络型基础设施。其中“新…

工业互联网与高端装备健康管理解决方案

工业互联网是基于工业数据,运用大数据技术,贯穿于工业生产的设计、工艺、生产、管理、服务等全生命周期,使工业系统具备描述、诊断、预测、决策、控制等智能化功能的模式和结果。 为实现功能安全前提下的工业控制系统信息安全,需…