Nginx 向客户端输出真实的后端IP地址

因为涉及到内外网的改造,所以狠多东西现在需要依赖于openresty来做总控实现。然后就碰见了一个比较难办的问题,即在upstream时候,如何获取实际处理请求的server地址。假设有如下upstream配置:

upstream backend {
server 127.0.0.1:88882
server 127.0.0.1:88892
}

location /test {
proxy_pass http://backend2
}

当我请求test的时候,我同时想直到到底是backend的哪一个server处理了,也就是我想得到实际处理的server地址。对于这个问题,我想了狠久,也走了狠多弯路,浪费了不少时间。

server return local ip?
首先,最简单的做法,就是对于实际的upstream server,在处理test这个请求的时候返回自己的ip地址就可以了,不过这种方法通用性太差,并且如果该server有多ip,可能取得的本机ip跟upstream里面配置的还不一样。

get upstream conf module?
然后,我想是不是nginx提供了一个模块,能够读取conf解析之后的所有信息,对这个模块的查找让我走了弯路,google了一下,发现没有相关东西,我还狠sb的一直不停的搜索。也不想想即使有这样的模块,如果我想要实现这个功能也是一件不怎么容易的事情。

upstream_addr
等到走了一些弯路,才发现nginx的upstream本来就有一个upstream_addr的模块,一下子我觉得找到了方向,不过看这个变量的说明,发现它主要用在记录log上面,而且没说明外界如何获取。查了一些资料之后,发现nginx有一个add_header,该指令干的事情就是在http response header里面加入自己定义的header,于是我在conf里面添加了这条指令,如下:

locaiton /test {
add_header Kss-Upstream $upstream_addr2
proxy_pass http://backend2
}

这样,当我访问test的时候,response header里面就会有响应server的地址。

request:
curl -i http://127.0.0.1/test

response:

HTTP/1.1 200 OK
Kss-Upstream: 127.0.0.1:8888
subrequest response header
如果直接请求test,会狠好的得到upstream的addr,但是,如果是subrequest请求,就发现得不到了,如下:

location /test1 {
local res = ngx.location.capture("/test")
ngx.say(res.header["Kss-Upstream"])
}

请求test1的时候,发现subrequest的response header里面根本没有Kss-Upstream这个字段。当时狠迷惑,google之后发现这个:Headers not returned from subrequest,原来,subrequest的header是不会返回到parent request这个层面的。至于如何处理,我按照上面的说明采用了两种做法,发现都可行。

more_set_headers
agentzh举了more_set_headers这种做法的一个例子,直接把add_header换成more_set_headers "Kss-Upstream: $upstream_addr"2这条语句搞定。

header_filter_by_lua
另一个做法就是使用header_filter_by_lua这个指令,该指令是处理header response filter的,在里面将upstream_addr的值设置到nginx的一个变量里面。如下:

location /test {
proxy_pass http://_test2
header_filter_by_lua 1
ngx.var.upaddr = ngx.var.upstream_addr
12
}

location /test1 {
set $upaddr 112
content_by_lua 1
local res = ngx.location.capture("/test", {share_all_vars = true})
ngx.say(ngx.var.upaddr)
12
}

对于这种方式,实现较为繁琐,首先需要定义一个变量用来存储upstream_addr的值,同时在capture的时候还需要设置share_all_vars为true。鉴于此,还是使用more_set_headers这条语句方便狠多。

后来我又实现了一下,发现没必要这么复杂,完全可以不需要变量传递,只是在header_filter_by_lua里面这么做就可以了

header_filter_by_lua 1
ngx.header.kss_upstream_add = ngx.var.upstream_addr

记录下,送给不知道的朋友!

Nginx 向客户端输出真实的后端IP地址

时间: 2024-11-08 14:31:56

Nginx 向客户端输出真实的后端IP地址的相关文章

获取客户端、服务器、本地IP地址

//获取客户端.服务器.本地IP地址 public static string getIPAddress() { ////本地IP //string address = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName()).GetValue(2).ToString();//IP4 地址 ////本地电脑名称 //string addname = System.Net.Dns.GetHostName().ToString();

【Python】 http客户端库requests & urllib2 以及ip地址处理IPy

requests requests是个HTTPClient库,相比于urllib,urllib2等模块比更加简洁易用 ■ get请求 作为示例,讲一下关于requests如何发起并处理一个get请求 r = requests.get("http://www.baidu.com") #可以加入timeout参数来设置超时 r是一个Response对象,可以用r查看很多信息 如r.status_code 查看本次请求的http返回码 r.headers 头部信息(是个类字典对象) r.ur

CDN下nginx获取用户真实IP地址

随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到,如果是后端真实服务器是nginx,那么继续往下看. 实例环境: 用户IP 120.22.11.11 CDN前端 61.22.22.22 CDN中转 121.207.33.33 公司NGINX前端代理 192.168.50.121(外网121.207.

Nginx部署虚拟主机(不同域名、不同端口、不同IP地址)

介绍 Nginx是一款轻量级的HTTP服务器软件,由俄罗斯的Igor Sysoev开发.它能够支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且系统资源消耗非常低,现已逐渐被越来越多的用户认可,目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力. 系统环境: rhel 6.5 操作系统 服务器IP地址:192.168.100.5 客户机IP地址:192.168.100.30(与服务器同网段并能够互联互通) Ng

nginx配置虚拟主机之不同端口和不同IP地址

配置nginx虚拟主机不同端口和不同ip地址,和上编nginx基于域名配置虚拟主机博文类似,请先参考. zxl.com域名不同端口,配置文件内容如下: [[email protected] conf.d]# cat zxl.com.conf  server { listen 81; server_name www.zxl.com zxl.com; location / { root /data/zxl; index index.html index.htm; access_log  logs/z

请问客户端PC应该如何限制其自动获取IP地址?

目前状况: 1.有一台三层交换机,在三层交换机上面做了 ip dhcp pool XXX ,并定义了network 范围 2.三层交换机连接到各接入层交换机 问题: 1.如何让客户端不能自动获取到IP地址? 2.IP地址该如何跟MAC地址绑定好? 3.在三层交换机配置了dhcp pool ,在配置了pool之后用no service dhcp 命令有什么问题吗? 4.如何关闭网络交换机DHCP功能? 欢迎各路大神指教!

使用CDN之后APACHE日志记录中IP地址不正确的解决方案

这篇文章主要介绍了使用CDN之后APACHE日志记录中IP地址不正确的解决方案,需要的朋友可以参考下最近在搞APACHE日志分析,装好了awstats之后,这两天进行了观察, 报表日期 月 1 月 2010首次参观日期 2010年01月12日 11:04最近参观日期 2010年01月13日 23:59参观者 参观人次 网页数 文件数 字节浏览器流量 * 77 226 (2.93 参观人次/参观者) 508979 (2252.11 网页数/参观) 509492 (2254.38 文件数/参观) 1

搭建DHCP服务实现动态分配IP地址【详解】

搭建DHCP服务实现动态分配IP地址   一:实验内容 DHCP服务器工作原理 使用DHCP为局域网中的机器分配IP地址 使用DHCP为服务器分配固定IP地址   二:实验环境: 服务端:xuegod63  IP:192.168.1.70 客户端:RHEL-6.2-64-71  IP:192.168.1.71 客户端:RHEL-6.2-64-72  IP:192.168.1.72   三:实验步骤 第一块:概述 1:DHCP服务概述: 名称:DHCP  - Dynamic Host Config

Java网络编程从入门到精通(8):用getAddress方法获得IP地址

getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.getAddress方法的定义如下: public byte[] getAddress() 这个方法返回的byte数组是有符号的.在Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.由于Java中没有无符号byte类型,因此