前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx proxy_set_header 理解

Nginx proxy_set_header 理解

作者头像
用户5640963
发布2019-07-26 10:41:26
1K0
发布2019-07-26 10:41:26
举报
文章被收录于专栏:卯金刀GG

用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过。 当前使用的是Nginx负载均衡,从客户端到Nginx端 ip和port都对,从Nginx到应有服务器上-port端口变成很奇怪的端口号。真是遇到的问题,登录页的ip和port在登录验证没有问题,但在登录完成后跳转的时候,端口号发生了变化。跟nginx服务器的监听端口相同了。(注:除了部署的Nginx服务器,应该还有一个前端的nginx,这是我没有接触到的部分。) 疑问:Nginx往应有服务器上 是如何 传递 客户端IP和port 参数的呢? 请看 Nginx proxy_set_header

Nginx proxy_set_header 允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:

代码语言:javascript
复制
proxy_set_header Host       $proxy_host;
  proxy_set_header Connection close;

如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 将不会被代理服务器传递。 一个不会变化的“Host”头请求字段可通过如下方式被传递:

我的项目就使用了这个参数设置,请求的host的IP和PORT没变

代码语言:javascript
复制
proxy_set_header Host       $http_host;

然后,当字段不在请求头中就无法传递啦。在这种情况下,可通过设置Host变量,将需传递值赋给Host变量。

代码语言:javascript
复制
proxy_set_header Host       $host;

此外,服务器名称和端口一起通过代理服务器传递。

代码语言:javascript
复制
proxy_set_header Host       $host:$proxy_port;

如果请求头的存在空的字段将不会通过代理服务器传递出去。

代码语言:javascript
复制
proxy_set_header Accept-Encoding "";

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

  1. 测试 不设置 proxy_set_header Nginx配置 upstream test { server 192.168.220.123:9099; server 192.168.220.123:58080; } server { listen 5800; server_name 192.168.220.123; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://test; } 测试jsp 想获取客户端IP、客户端port、代理服务器IP、代理服务器port <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%> <% String scheme = request.getScheme(); String serverName = request.getServerName(); String remoteName = request.getRemoteAddr(); String realIP = request.getHeader("X-Forwarded-For"); String realIP2 = request.getHeader("X-Real-IP"); String Host = request.getHeader("Host"); int port = request.getServerPort(); int portR = request.getRemotePort(); String requestURIC1 = scheme+"://"+realIP+":"+portR; String requestURIC2 = scheme+"://"+realIP2+":"+portR; String requestURIC3 = scheme+"://"+remoteName+":"+portR; String requestURI = scheme+"://"+serverName+":"+port; %> 客户端地址1:<%=requestURIC1 %> <br> 客户端地址2:<%=requestURIC2 %> <br> 客户端地址3:<%=requestURIC3%> <br> 服务器地址1:<%=requestURI%> <br> 服务器地址2:<%=Host%> <br> 测试结果 客户端地址1:http://null:58828 客户端地址2:http://null:58828 客户端地址3:http://192.168.220.123:58828 服务器地址1:http://test:80 服务器地址2:test Nginx日志 192.168.220.177 -20508---5800 [25/Aug/2016:16:34:13 +0800] "GET /docs/test.jsp HTTP/1.1" 200 223 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" "-" 其中客户端IP不能获取到,而通过request.getRemoteAddr();获取的IP是代理服务器IP,而不是客户端IP,而在nginx中$remote_addr变量的值是客户端的IP,可见remoteaddr没有传递。 而server_port值也不对,当前值为5800,当前打印出的是80。 而当前代理为http://test 所有通过host得到的是test。 客户端port也获取不到值为20508,可传给应用的是58828
  2. 测试 设置proxy_set_header Nginx 配置 upstream test { server 192.168.220.123:9099; server 192.168.220.123:58080; } server { listen 5800; server_name 192.168.220.123; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://test; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } 测试页面改成: <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%> <% String scheme = request.getScheme(); String serverName = request.getServerName(); String remoteName = request.getRemoteAddr(); String realIP = request.getHeader("X-Forwarded-For"); String realIP2 = request.getHeader("X-Real-IP"); String Host = request.getHeader("Host"); int port = request.getServerPort(); int portR = request.getRemotePort(); String portR2 = request.getHeader("X-Real-Port"); String requestURIC1 = scheme+"://"+realIP+":"+portR; String requestURIC2 = scheme+"://"+realIP2+":"+portR; String requestURIC3 = scheme+"://"+remoteName+":"+portR; String requestURI = scheme+"://"+serverName+":"+port; %> 客户端地址1:<%=requestURIC1 %> <br> 客户端地址2:<%=requestURIC2 %> <br> 客户端地址3:<%=requestURIC3%> <br> 服务器地址1:<%=requestURI%> <br> 服务器地址2:<%=Host%> <br> 客户端port2:<%=portR2%> <br> 测试结果: 客户端地址1:http://192.168.220.177:21548 客户端地址2:http://192.168.220.177:21548 客户端地址3:http://192.168.220.123:21548 服务器地址1:http://192.168.220.123:5800 服务器地址2:192.168.220.123:5800 客户端port2:20604 Nging日志: 192.168.220.177 -20604---5800 [25/Aug/2016:16:38:42 +0800] "GET /docs/test.jsp HTTP/1.1" 200 275 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" "-" 除request.getRemoteAddr();获取的值不对外,其他值都是对的。 getRemoteAddr获取的是代理的请求地址。 因重定义了host,所以test值被改写成代理服务器IP。 因重定义了 X-Real-PORT-并传递$remote_port,客户端port也获取正确啦。 弄清楚是怎么传值的,正确的使用Nginx又向前进了一步。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档