赞
踩
Fork me on GitHub
自由早晚乱余生
立志要如山,行道要如水,如山能坚定,如水能曲达
博客园 首页 新随笔 联系 订阅 管理随笔 - 172 文章 - 12 评论 - 126
一次 Nginx proxy_set_header 故障问题解析和延升
目录
一、问题和排查步骤
1.1 问题基本信息
1.2 问题解析
1.3、解决办法
二、扩展-各种情况对比
默认两项
proxy_set_header 其他项等
总结
三、扩展 ->脚本
proxy_set_header $host $proxy_host $http_host 各个变量含义
python 获取请求所有数据信息脚本
本文会先由一个问题引入,然后再进行多种情况进行分析。
一、问题和排查步骤
1.1 问题基本信息
我们应用程序从代码层面收到的 Header 中的 Host 的值是 upstream 的 名称。 我们程序是需要获取到实际的值。所以这里存在一个问题。
我们先看看我们的 nginx 配置。
upstream open-hz8443{
server 10.60.6.184:8000 max_fails=1 fail_timeout=3s weight=10;
}
server{
server_name 192.168.80.132;
listen 80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
proxy_next_upstream error timeout invalid_header http_404 http_502 http_504 http_500;
location / {
proxy_pass http://open-hz8443;
}
location ^~ /wss/v1
{
proxy_pass http://open-hz8443;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
tcp_nodelay on;
}
}
我们请求 http://192.168.80.132/wss/v1, 我们可以在后端(10.60.6.184:8000)获取到 Host 的值为 open-hz8443。
这个是我们做了一个 脚本,用于获取请求的所有的数据的。 脚本具体内容在文末。
Connection: upgrade
Host: open-hz8443 # 获取到的Host 是 open-hz8443
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 FS
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
10.210.20.43 - - [04/Jan/2021 15:54:46] “GET /wss/v1 HTTP/1.0” 200 -
1.2 问题解析
首先这里有知识点:
我们在 Server 配了 proxy_set_header Host $host; , 我们在 location 是只配置了
proxy_set_header Connection “upgrade”;
proxy_set_header Upgrade $http_upgrade;
我们的 Host 最初我认为是会继承 Server 配置的 proxy_set_header Host $host; , 但是明显是没有继承的,而是直接拿的 upstream 的名称。说明没有继承,那么这里是有一个什么规则? 我们往下看。
查询 Nginx 官方文档。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level. By default, only two fields are redefined:
大概意思就是当我们没有设置 proxy_set_header 才会从上一层级继承,当我们设置了 proxy_set_header ,也就意味着我们不从上面 server 的 proxy_set_header Host $host; 进行继承。
那为什么会显示 open-hz8443, 是因为有一个默认值
proxy_set_header Host $proxy_host;
这个 proxy_host,
当我们设置了 upstream 的话,也就是上面的例子$proxy_host 就是 upstream的名称值.
当我们直接使用的 proxy_pass http://10.60.6.184:8000 的话,那么 $proxy_host 表示的就是 10.60.6.184:8000
1.3、解决办法
在 location ^~ /wss/v1 下面增加配置 proxy_set_header Host $host;。
location ^~ /wss/v1
{
proxy_pass http://open-hz8443;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
tcp_nodelay on;
}
二、扩展-各种情况对比
默认两项
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
proxy_set_header 其他项等
proxy_set_header Connection “upgrade”;
proxy_set_header Upgrade $http_upgrade;
Server 设置 proxy_set_header 其他项 Server 设置 proxy_set_header 默认两项 location 设置 proxy_set_header 默认两项 location 设置 proxy_set_header 其他项 默认值生效 默认值不生效
1 1 1 1 1 继承location
1 1 0 1 1(不继承Server)
1 1 1 0 1 继承location
1 1 0 0 1 继承server
1 0 1 0 1 继承location
1 0 0 0 1 默认
1 0 0 11 1 默认
1 0 1 1 1 继承location
0 1 0 0 1 继承server
0 1 0 1 1 默认
0 1 1 0 1 继承location
0 1 1 1 1 继承location
0 0 0 1 1 默认
0 0 1 0 1 继承location
0 0 1 1 1 继承location
0 0 0 0 1 默认
总结
location 设置了 proxy_set_header 就不继承,但继承默认值,默认值优先级低于 location设置。
location 未设置了proxy_set_header ,就往上继承,直到默认值。
只要调用了 proxy_set_header,并没有设置 host 和 connection ,默认重写host、connection两个头。
三、扩展 ->脚本
proxy_set_header $host $proxy_host $http_host 各个变量含义
记录一次 Nginx 配置 proxy_pass 后 返回404问题
python 获取请求所有数据信息脚本
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
PORT = 8000
class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
print(self.headers)
self.send_response(200, “”)
def do_POST(self):
print(self.headers)
content_length = self.headers.getheaders(‘content-length’)
length = int(content_length[0]) if content_length else 0
print(self.rfile.read(length))
self.send_response(200, “”)
Handler = GetHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
作者:理想三旬
出处:https://www.cnblogs.com/operationhome/p/14248830.html
如果觉得文章写得不错,或者帮助到您了,请点个赞,加个关注哦。运维学习交流群:544692191
本文版权归作者所有,欢迎转载,如果文章有写的不足的地方,或者是写得错误的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。
分类: nginx
好文要顶 关注我 收藏该文
自由早晚乱余生
关注 - 17
粉丝 - 165
推荐博客
+加关注
0 0
« 上一篇: 记录一次 Nginx 配置 proxy_pass 后 返回404问题
posted @ 2021-01-07 21:43 自由早晚乱余生 阅读(53) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】第一个NoSQL数据库,在大规模和一致性之间找到了平衡
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
相关博文:
· ProxyReflect
· nginxproxy大文件上传失败问题总结
· charles开启Charles-Proxy-macOSProxy时报错
· ES6知识点-Proxy和Reflect
· es6proxy浅析
» 更多推荐…
最新 IT 新闻:
· 刹不住车了:比特币再创价格新高!破3.7万美元
· 华为P40、Mate 30等多款老机型上线智感支付功能!抬手自动弹出付款码
· 2025年中国大陆芯片将达2230亿美元 但自给率仍不到20%?
· 法拉第未来任命新CFO!贾跃亭激动发声
· 瑞幸咖啡“宫斗大戏”背后:陆正耀还想当王
» 更多新闻…
公告
昵称: 自由早晚乱余生
园龄: 3年4个月
荣誉: 推荐博客
粉丝: 165
关注: 17
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
aws云(2)
Docker(6)
ELK(16)
expect(3)
fail2ban(1)
freepbx(6)
Jenkins(5)
KVM(1)
linux(51)
mail(3)
mongodb(11)
mysql(3)
nginx(12)
Pinpoint(6)
python(6)
更多
随笔档案
2021年1月(2)
2020年12月(1)
2020年11月(7)
2020年9月(2)
2020年8月(1)
2020年7月(2)
2020年6月(1)
2020年5月(2)
2020年4月(2)
2020年3月(5)
2020年2月(6)
2020年1月(5)
2019年12月(2)
2019年11月(6)
2019年10月(1)
更多
最新评论
–liucx
4. Re:centos7 Mariadb5.5升级到Mariadb10.2
@自由早晚乱余生 关注了…
–lizhenlzlz
5. Re:Pinpoint系列文章目录
@jmacro 使用Hbase2 版本需要注意,要重新编译然后加上指定参数才可以使用。…
–自由早晚乱余生
阅读排行榜
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。