用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过。
当前使用的是Nginx负载均衡,从客户端到Nginx端 ip和port都对,从Nginx到应有服务器上-port端口变成很奇怪的端口号。
疑问:Nginx往应有服务器上 是如何 传递 客户端IP和port 参数的呢?
请看 Nginx proxy_set_header

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

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”头请求字段可通过如下方式被传递:

proxy_set_header Host       $http_host;

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

proxy_set_header Host       $host;

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

proxy_set_header Host       $host:$proxy_port;

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

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

  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;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又向前进了一步。

Nginx proxy_set_header 理解相关推荐

  1. 服务器之Apache和Tomcat和Nginx的理解和对比

    1 问题 公司服务器用的Apache,后台是php语言,然后服务端用的linux C/C++,会经常听到Apache服务器,然后之前实习的公司服务端用的java,然后依稀记得使用了nginx反向代理服 ...

  2. Nginx - 深入理解nginx的处理请求、进程关系和配置文件重载

    概述 Nginx的系统学习整理的第三篇博客,主要介绍nginx的应用场景和架构基础,以便更好的理解,再生产环境中进行性能调优. Nginx的三个主要应用场景 1.静态资源服务,通过本地文件系统提供服务 ...

  3. nginx简介--理解nginx配置/模块/openresty

    1. nginx功能和定位 Nginx最核心的功能是Web服务器和反向代理服务器. Web服务器完成对HTTP请求协议的解析和以HTTP协议格式响应请求.缓存.日志处理这些基本Web服务器功能: 反向 ...

  4. 从项目实际问题引发的思考

    最近在开发过程中遇到了这么一个问题: 现在有一个 Web 项目,前端是使用 Vue.js 开发的,整个前端需要部署到 K8S 上,后端和前端分开,同样也需要部署到 K8S 上,因此二者需要打包为 Do ...

  5. 通俗理解什么是Nginx

    举个例子: 你写了一个项目,前后端分离,前端使用ajax来访问后端API,那么你本地运行你的项目是这么个顺序 启动后端服务 启动前端服务 但是你前端就是一写静态文件(js css html等),怎么运 ...

  6. uwsgi模式_nginx+uwsgi 和nginx+gunicorn区别、如何部署

    [线上环境部署Django,nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择?] 大家是采用的何种部署方式? 第一种,高并发稳定一点 我们公司使用的是nginx+gun ...

  7. ajax nginx 转发 sessionid_「查缺补漏」巩固你的Nginx知识体系

    基本介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试 Nginx 能够支撑 ...

  8. 软件架构-nginx详解上

    今天说说nginx, 其实有老铁比较奇怪,nginx不是运维来搞的吗?确实是的,大部分情况下,公司比较大的话,存在运维的话,这个锅肯定是运维来做的.但是现在有个趋势叫devops之前我也说过,开发运维 ...

  9. Nginx教程(小白必看,看了必会,不看血亏),

    Notice 测试请打开浏览器禁止缓存 Notice:再使用前,请打开浏览器 F12 然后网络 然后点禁用缓存,避免nginx配置后磁盘缓存的情况.而且,请确认host没问题. 备注:你本地设置的ho ...

最新文章

  1. 可视化LassoCV的最佳alpha值
  2. Ncut matlab 代码bug 修复
  3. 每日一皮:努力寻找Bug的程序员
  4. linux常用核心命令大全(只写程序员常用的)
  5. 【opencv】5.cv::findContours和cv::drawContours()
  6. VTK:图片之ImageThreshold
  7. GCPC2017 题解
  8. php删除文见,php如何删除文件夹
  9. 服务器最小化安装后的优化脚本
  10. after you've written your business model
  11. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
  12. Atitit 施政策略总结 目录 1. 行政综合方面的策略 2 1.1. 加强宣传无处不在策略 占领各大网络与实体阵地 2 1.2. 装点门面,不花钱或者少花钱的东西体系全部搞起来 2 1.3. 加大
  13. 宽带网速如何测试软件,怎样测试网速 多种测试网速方法【推荐】
  14. 暴风电视刷鸿蒙系统刷机包,暴风电视蓝屏怎么解决
  15. linux ubuntu木马,Ubuntu病毒查杀 ClamAV 简介以及适用范围
  16. html图片铺底代码,梦幻西游底部师徒四人动态图
  17. 王者荣耀服务器维护多久12.4,王者荣耀12月4日维护新活动介绍 王者荣耀维护到几点...
  18. 让linux识别html,8 款浏览器对 HTML5 支持评测
  19. LeetCode刷题(python版)——Topic30串联所有单词的子串
  20. 安卓7.0 申请相机及读写权限

热门文章

  1. 【.Net实用方法总结】 整理并总结.NET 中的 System.IO.Pipelines(管道)
  2. 竖排文字垂直居中css样式
  3. 阿里云 IoT 物联网实例讲解——实践类
  4. 人生就是一个经典的菜谱
  5. 超全UI样机图片素材网站整理
  6. Exception:java.lang.IllegalArgumentException: invalid comparison
  7. Even Array
  8. html字体位置向上,css怎么移动文字,html字体位置
  9. WEB打印插件jatoolsPrinter
  10. java poi导出兼容office