Nginx proxy_set_header 理解
用户认证接口:根据客户端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 就是可设置请求头-并将头信息传递到服务器端。不属于请求头的参数中也需要传递时 重定义下就行啦。
- 测试 不设置 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
- 测试 设置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 理解相关推荐
- 服务器之Apache和Tomcat和Nginx的理解和对比
1 问题 公司服务器用的Apache,后台是php语言,然后服务端用的linux C/C++,会经常听到Apache服务器,然后之前实习的公司服务端用的java,然后依稀记得使用了nginx反向代理服 ...
- Nginx - 深入理解nginx的处理请求、进程关系和配置文件重载
概述 Nginx的系统学习整理的第三篇博客,主要介绍nginx的应用场景和架构基础,以便更好的理解,再生产环境中进行性能调优. Nginx的三个主要应用场景 1.静态资源服务,通过本地文件系统提供服务 ...
- nginx简介--理解nginx配置/模块/openresty
1. nginx功能和定位 Nginx最核心的功能是Web服务器和反向代理服务器. Web服务器完成对HTTP请求协议的解析和以HTTP协议格式响应请求.缓存.日志处理这些基本Web服务器功能: 反向 ...
- 从项目实际问题引发的思考
最近在开发过程中遇到了这么一个问题: 现在有一个 Web 项目,前端是使用 Vue.js 开发的,整个前端需要部署到 K8S 上,后端和前端分开,同样也需要部署到 K8S 上,因此二者需要打包为 Do ...
- 通俗理解什么是Nginx
举个例子: 你写了一个项目,前后端分离,前端使用ajax来访问后端API,那么你本地运行你的项目是这么个顺序 启动后端服务 启动前端服务 但是你前端就是一写静态文件(js css html等),怎么运 ...
- uwsgi模式_nginx+uwsgi 和nginx+gunicorn区别、如何部署
[线上环境部署Django,nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择?] 大家是采用的何种部署方式? 第一种,高并发稳定一点 我们公司使用的是nginx+gun ...
- ajax nginx 转发 sessionid_「查缺补漏」巩固你的Nginx知识体系
基本介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试 Nginx 能够支撑 ...
- 软件架构-nginx详解上
今天说说nginx, 其实有老铁比较奇怪,nginx不是运维来搞的吗?确实是的,大部分情况下,公司比较大的话,存在运维的话,这个锅肯定是运维来做的.但是现在有个趋势叫devops之前我也说过,开发运维 ...
- Nginx教程(小白必看,看了必会,不看血亏),
Notice 测试请打开浏览器禁止缓存 Notice:再使用前,请打开浏览器 F12 然后网络 然后点禁用缓存,避免nginx配置后磁盘缓存的情况.而且,请确认host没问题. 备注:你本地设置的ho ...
最新文章
- 可视化LassoCV的最佳alpha值
- Ncut matlab 代码bug 修复
- 每日一皮:努力寻找Bug的程序员
- linux常用核心命令大全(只写程序员常用的)
- 【opencv】5.cv::findContours和cv::drawContours()
- VTK:图片之ImageThreshold
- GCPC2017 题解
- php删除文见,php如何删除文件夹
- 服务器最小化安装后的优化脚本
- after you've written your business model
- python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
- Atitit 施政策略总结 目录 1. 行政综合方面的策略	2 1.1. 加强宣传无处不在策略 占领各大网络与实体阵地	2 1.2. 装点门面,不花钱或者少花钱的东西体系全部搞起来	2 1.3. 加大
- 宽带网速如何测试软件,怎样测试网速 多种测试网速方法【推荐】
- 暴风电视刷鸿蒙系统刷机包,暴风电视蓝屏怎么解决
- linux ubuntu木马,Ubuntu病毒查杀 ClamAV 简介以及适用范围
- html图片铺底代码,梦幻西游底部师徒四人动态图
- 王者荣耀服务器维护多久12.4,王者荣耀12月4日维护新活动介绍 王者荣耀维护到几点...
- 让linux识别html,8 款浏览器对 HTML5 支持评测
- LeetCode刷题(python版)——Topic30串联所有单词的子串
- 安卓7.0 申请相机及读写权限
热门文章
- 【.Net实用方法总结】 整理并总结.NET 中的 System.IO.Pipelines(管道)
- 竖排文字垂直居中css样式
- 阿里云 IoT 物联网实例讲解——实践类
- 人生就是一个经典的菜谱
- 超全UI样机图片素材网站整理
- Exception:java.lang.IllegalArgumentException: invalid comparison
- Even Array
- html字体位置向上,css怎么移动文字,html字体位置
- WEB打印插件jatoolsPrinter
- java poi导出兼容office