多级nginx代理,获取客户端真实ip

摘要:
此错误的直接原因是传入的客户端IP与发起的支付的IP不匹配。我们必须改进nginx来记录每一级代理的IP地址。对于第一级nginx代理位置~^/test{proxy_passhttp:直接将原始客户端IP地址记录到X-Forwarded-For。对于第二级以及以后的级别,可能会有更多的代理位置~^/test{proxy_pass http:

今天服务里的微信公众号支付业务突然不能用了,报错为网络环境未能通过安全验证,请稍后再试。检查后端日志,没有任何问题,看来是成功创建支付订单,但是调起支付时出现了问题。上网查了一下,这个报错的直接原因是传入的客户端ip与调起支付的ip不符。但是印象中我在代码中获取的是X-Forwarded-For,就是请求来源的客户端IP,就查看日志发现传给微信的ip为172.17.0.1,也就是宿主机ip,这是才恍然大悟,在升级线上环境时我们将所有服务放进了docker,并且在docker里装了nginx来分发请求给对应的服务,也就是说我们是两级nginx代理,我们的服务是没法拿到最外层客户端ip的。只好改进nginx将每级代理的ip都记录起来,而不是直接覆盖。

改进方法:

对第一级nginx代理

location ~ ^/test {
  proxy_pass http://127.0.0.1:8888;
  proxy_set_header Host $host;
  proxy_set_header X-real-ip $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
}

第一级nginx代理不需要改动,直接将原始客户端ip记录到X-Forwarded-For即可

对于第二级,以及之后可能存在的更多级代理

location ~ ^/test {
  proxy_pass http://127.0.0.1:12000;
  proxy_set_header Host $host;
  proxy_set_header X-real-ip $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这样就将新一级代理的ip接到X-Forwarded-For的尾部,并用逗号分割。也就是说X-Forwarded-For是一个逗号拼接的ip字符串,想拿到原始ip只需要按逗号分割,取第一位ip即可。

Golang业务中读取原始客户端ip代码

	real_ip := r.Header.Get("X-Forwarded-For")
	ip_list := strings.Split(real_ip, ",")
	if len(ip_list) > 1 {
		real_ip = ip_list[0]
	}

就是这么简单啦,希望对大家有所帮助~

免责声明:文章转载自《多级nginx代理,获取客户端真实ip》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle查询中将结果列按分组用逗号隔开,拼接成一行(listagg函数)GC日志时间分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

全网NFS存储架构详解与分析

全网NFS存储架构详解与分析   在企业集群架构的工作场景中,NFS网络文件系统一般用来存储共享视频、图片、附件等静态资源文件,一般是网站用户上传的文件都放在NFS共享里,例如播客产品的图片、附件、头像、注意网站程序不要放在NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源,所以NFS是当前中小型互联网架构中最常用的数据...

linux socket编程client获取使用的ip和port

今天为了测试机器绑定多ip时socket client使用的ip和port, 因此查询资料看了下如何获取client的ip和port(系统自选而不是bind绑定) 主要是对连接的描述符通过getsockname 函数获取client的地址信息,函数说明如下 #include <sys/socket.h> int getsockname(int...

C# 异步Socket

C# 异步Socket (BeginXXXX)服务器代码 前言: 1、最近维护公司的一个旧项目,是Socket通讯的,主要用于接收IPC(客户端)发送上来的抓拍图像,期间要保持通讯,监测数据包并进行处理。但是看之前那人写的代码个人觉得并不是很适合自己,于是就重写了,不过项目暂时弃置了,为了以后能够方便使用,也方便更多像我一样还是渣渣程序员的人,记录一些心得...

各大巨头电商提供的IP库API接口新浪、搜狐、阿里

新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js     (不可用)新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42     (...

远程访问及控制

一:配置服务端 添加测试账号,aaa 1:服务监听选项 [root@localhost ~]# setenforce 0 注意:如果不关闭selinux,不能修改端口号 [root@localhost ~]# vi /etc/ssh/sshd_config 修改      17 Port 22                 \监听的端口      19...

服务器端Session和客户端Session(和Cookie区别)

Session其实分为客户端Session和服务器端Session。 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户...