nginx之配置proxy_set_header

2023-11-01

nginx之配置proxy_set_header
win10客户端请求web服务,win10的ip:192.168.223.1

nginx作为反向代理服务器:192.168.223.136

nginx作为后端web服务器:192.168.223.137

前提条件:配置nginx转发到后端服务器

server {
listen 8080;
server_name 192.168.223.136;
location / {
root "/www/html";
index index.html;
#auth_basic "required auth";
#auth_basic_user_file "/usr/local/nginx/users/.htpasswd";
error_page 404 /404.html;
}
location /images/ {
root "/www";
rewrite ^/images/bbs/(.*\.jpeg)$ /images/$1 break;
rewrite ^/images/www/(.*)$ http://192.168.223.136/$1 redirect;
}
location /basic_status {
stub_status;
}
location ^~/proxy_path/ {
root "/www/html";
index index.html;
proxy_pass http://192.168.223.137/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

location ^~/proxy_path/ {
root "/www/html";
index index.html;
proxy_pass http://192.168.223.137/;

将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器192.168.223.137

现在一一测试各个proxy_set_header设置的变量的内容

1、proxy_set_header Host $host;

将136代理服务器,137后端服务器的log_format修改为如下:

log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

proxy_set_header Host $host;这里的Host变量的值对应的就是日志中的$http_host 的值
当win10用户访问http://192.168.223.136:8080/proxy_path/index.html时
查看代理服务器和后端服务器的地址,可以发现$http_host对应的值为192.168.223.136:8080
192.168.223.1 - - [18/Jul/2017:10:21:25 +0800] “GET /favicon.ico HTTP/1.1” 192.168.223.136:8080 404 24 “http://192.168.223.136:8080/proxy_path/index.html” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”
由于我将后端服务器关闭了,所以出现502网管错误:

然后开启137后端nginx,查看日志:

192.168.223.136 “192.168.223.1” - - [17/Jul/2017:17:06:44 +0800] “GET /index.html HTTP/1.0” “192.168.223.136” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko” “192.168.223.1”

即验证了proxy_set_header Host $host; $host就是nginx代理服务器,也就是win10客户端请求的host

2、proxy_set_header Host $proxy_host;

将设置修改为上述proxy_host然后重启ngxin代理服务器136

[root@wadeson nginx]# sbin/nginx -s reload

重新请求代理页面:http://192.168.223.136:8080/proxy_path/index.html,然后日志如下:

首先查看136代理服务器的日志:

192.168.223.1 - - [18/Jul/2017:10:30:12 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

因为win10是136的客户端,请求的host为192.168.223.136:8080,而nginx代理服务器作为137后端服务器的客户端,将请求的报文首部重新封装,将proxy_host封装为请求的host

那么137上面日志请求的host就是其自身,proxy_host就是代理服务器请求的host也就是后端服务器137

192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:30:12 +0800] “GET /index.html HTTP/1.0” “192.168.223.137” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

3、**proxy_set_header Host $host:$proxy_port;**

了解了上面的知识,那么此处对应的host就知道代表的啥了,$host代表转发服务器,$proxy_port代表136转发服务器请求后端服务器的端口,也就是80

于是观察136、137的日志进行验证:

192.168.223.1 - - [18/Jul/2017:10:38:38 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:38:38 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

4、proxy_set_header X-Real-IP $remote_addr;

$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip

nginx转发136服务器日志格式为:

log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

nginx后端137服务器的日志格式:

log_format main '$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

两者区别在于"$http_x_real_ip",添加了这个变量的值

重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

136的日志:

192.168.223.1 - - [18/Jul/2017:10:45:07 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

137的日志:

192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:45:07 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

红色标记的就是"$http_x_real_ip"的值,即可以看见用户真实的ip,也就是客户端的真实ip

5、proxy_set_header X-Forwarded-For $remote_addr;

理解了上面的含义那么这个封装报文的意思也就请求了

首先还是比对136和137的日志格式:

136代理服务器的日志格式:

log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

137后端服务器的日志格式:

log_format main '$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

136的日志显示:

192.168.223.1 - - [18/Jul/2017:10:51:25 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”,最后一个字段"$http_x_forwarded_for"对应的为空值

137的日志显示:

192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:51:25 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

可以看出137后端服务器成功的显示了真实客户端的ip

6、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

5、6两者的区别:

在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip

但是区别在于:

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx之配置proxy_set_header 的相关文章

随机推荐

  • Jmeter@场景负载加压

    目录 性能测试Jmeter 常用的主流场景 场景一 Thread Group 场景二 jp gc Stepping Thread Group 场景三 jp gc Ultimate Thread Group 场景四 bzm Concurren
  • 吴博:京东应用架构设计与治理

    吴博 京东应用架构设计与治理 经过十年的业务快速发展 京东信息系统复杂度越来越高 一般电商系统只需关心 进销存 中的 销 京东系统需要管理采购 进 销售 销 和库存 存 三个环节 系统做水平垂直拆分后 需要解决系统间如何解藕 如何保证高效通
  • python 基于异步的编程

    背景 除了顺序执行和并行执行的模型之外 还有第三种模型 叫做异步模型 这是事件驱动模型的基础 异步活动的执行模型可以只有一个单一的主控制流 能在单核心系统和多核心系统中运行 在并发执行的异步模型中 许多任务被穿插在同一时间线上 所有的任务都
  • 数字时序:时钟信号、抖动、迟滞和眼图

    转载地址 https www mr wu cn digital timing clock signals jitter hystereisis and eye diagrams 时钟信号 Clock Signals 发送数字信号其实发送的就
  • python-相似度计算的三种常用方法

    协同过滤就是通过将用户和其他用户的数据进行对比来实现推荐的 1 相似度计算 用欧氏距离来计算 相似度用距离来衡量 距离越大 相似度越小 距离越小 相似度越大 2 皮尔逊相关系数 这个参数用来度量两个向量之间的相似度 corroef 进行计算
  • 【Linux技术】linux连接mysql错误解决方案

    1 源码 connect mysql c include
  • C# Socket.Connect连接请求超时机制

    作者 RazanPaul 译者 Todd Wei 原文 http www codeproject com KB IP TimeOutSocket aspx 转自 http hi baidu com wf studio blog item d
  • Nginx配置及linux系统内存高并发多方面优化

    原文地址 http blog csdn net qq 23598037 article details 79505398 nginx的优化 1 gzip压缩优化 2 expires缓存有还 3 网络IO事件模型优化 4 隐藏软件名称和版本号
  • 基于数据挖掘的社交网络情感分析研究

    基于数据挖掘的社交网络情感分析研究 摘 要 随着近年来国内诸如微博 微信 国外诸如推特 Facebook 等知名社交网络平台及在线社交网络平台访问量的呈爆发式快速增长 人们已越来越地倾向于直接在各类社交网络平台基础上来表达其自己表达的各种观
  • JavaWebMyBatis中文写入数据库变问号解决方式

    首先感谢大佬给我思路 有同学也会这样 在学习javaweb时中文插入数据库变成了问号 如果你没用框架 那就在链接数据库的url后面加上 characterEncoding utf8 useUnicode true即可 具体可参考这篇文章 如
  • 16瓶药水一瓶有毒,去小白鼠测试哪一瓶水有毒?

    16瓶药水一瓶有毒 去小白鼠测试哪一瓶水有毒 面试的时候有个面试官问我 有16瓶药水 其中一瓶有毒 一只小白鼠喝过之后 一天之后会死亡 要求在少于15只小白鼠的情况下判断出哪一瓶有毒 药水可以兑在一起 小白鼠也可以喝多瓶药水 我在面试的时候
  • Filter——实现权限拦截

    创建Login jsp success jsp error jsp login jsp
  • DAPP开发初探

    前言 最近DAPP的开发貌似很火 学习了区块链的一些知识之后 相信有很多人和我一样 也想了解开发一个DAPP是一个怎样的流程 下面将通过一个简单的栗子来初识一下DAPP的开发流程 届时 我们也将开发出第一个DAPP应用 永存的留言 在线体验
  • OSG第三方库编译之十八:FBX安装(Windows、Linux、Macos环境下安装)

    目录 1 FBX介绍 2 FBX下载 3 Windows下安装 4 Linux下安装 5 MacOS下安装 1 FBX介绍 FBX是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件 通过FBX用户能访问大多数三维供应商
  • JavaScript 绘制柱状图

    JavaScript 绘制柱状图 index html文件
  • linux下的串口设备管理器,在Linux下用minicom管理串口设备

    因为近期要在外地建立一个网站的发布机房 设备有 防火墙 交换机 负载均衡器 DELL2950 1950服务器 存储设备等 设备都在外地 又没有远程over IP的KVM 所以想利用DELL服务器的 远程管理卡 对服务器进行 带外管理 接着用
  • Git GitHub管理代码

    准备工作 注册一个GitHub账号 电脑安装Git软件 新建仓库 上传代码 进入GitHub网页 登录 新建一个repositoty 只用填写仓库名字 不要勾选Initialize this repository with a README
  • 基于SpringBoot+Vue的家具网站设计与实现

    博主介绍 大家好 我是一名在Java圈混迹十余年的程序员 精通Java编程语言 同时也熟练掌握微信小程序 Python和Android等技术 能够为大家提供全方位的技术支持和交流 我擅长在JavaWeb SSH SSM SpringBoot
  • NACHI机械臂后台SOCKET通讯

    NACHI机械臂后台SOCKET通讯 将机械臂做为服务器 电脑作为客户端 通讯程序在机械臂后台运行 我是先在电脑上写好 导入机械臂文件夹中 转化成机器人语言 再在用户任务这里开启它的任务号码 端口号设置为10030 代码 TCP IP So
  • nginx之配置proxy_set_header

    nginx之配置proxy set header win10客户端请求web服务 win10的ip 192 168 223 1 nginx作为反向代理服务器 192 168 223 136 nginx作为后端web服务器 192 168 2