2021-01-05

Fork me on GitHub
自由早晚乱余生
立志要如山,行道要如水,如山能坚定,如水能曲达
博客园 首页 新随笔 联系 订阅 管理 随笔 - 171 文章 - 12 评论 - 126
记录一次 Nginx 配置 proxy_pass 后 返回404问题
一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位

1.1、 问题

在一次生产涉及多次转发的配置中, 需求是下面的图: image
在配置好了 proxy_pass 之后,请求 www.djx.com 直接返回 404,没有什么其他的异常。 但是我们直接请求后端 www.baidu.com 是正常响应的。这就很怪异的。 看日志请求也是转发到了 www.baidu.com 的。但是请求响应就是404.
1.2、 寻找问题原因

我们的默认的 Nginx的 proxy_set_header 配置是
proxy_set_header Host $host;

服务端: 192.168.2.189
服务端1:192.168.1.180 Nginx1
服务端2:192.168.1.90 Nginx2
image
当我们是这个的设置的时候,当第一层 Nginx(Nginx1)代理后,我们请求的域名是 www.djx.com ,从这个请求的 header 获取到的 host 的值是 www.djx.com, 我们通过 配置
proxy_set_header Host $host;
将 host 的值设置为转发 的Host 值,但是请求的域名是 www.baidu.com , 也就是 header 里面的是 host 字段是 www.djx.com , 请求的域名和 header 里面的 Host 的不一致导致的。
image
1.3、 proxy_set_header 官方信息

官方文档
默认设置为
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
1.4、 解决办法

Host 的值设置为 $proxy_host, $proxy_host 的值详解见下面扩展。
proxy_set_header Host $proxy_host;
二、扩展 常用的配置

  1. $proxy_host

proxy_set_header Host $proxy_host;

默认配置

顾名思义,请求头设置的为代理后的域名。

示例1:
当我们配置了 upstream, 那么$proxy_host 的值就是 upstream 的名字

upstream open-hz8443{
server 10.60.6.184:8000 max_fails=1 fail_timeout=3s weight=10;
}

那么这里 $proxy_host 的值就是 open-hz8443。
示例2:
当我们没有配置 upstream, 那么 $proxy_host 的值就是 proxy_pass 后面的地址ip和端口. 10.60.6.184:8000. 如果是 proxy_pass http://www.djx.com:8000; 那么 $proxy_host 的值就是 www.djx.com:8000.
location ^~ /wss/v1
{
proxy_pass http://10.60.6.184:8000;
proxy_set_header Host $proxy_host;
proxy_set_header Connection “upgrade”;
proxy_set_header Upgrade $http_upgrade;
tcp_nodelay on;

}
2. $host

proxy_set_header Host $host;

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

当请求 Header 里 Host 无值的时候,直接拿 server_name 的值进行填充。
当请求 Header 里 Host 的值的时候,就直接拿 请求 Header 里面的 Host 的值。
3. h o s t : host: host:proxy_port

proxy_set_header Host h o s t : host: host:proxy_port;

服务器名称和端口一起通过代理服务器传递,相对上一项,多了一个 $proxy_port,这个 $proxy_port 是proxy_pass 里面的那个端口,如果没有端口,像80 和 443 的话。也是会使用 80 /443 填充,

示例:
proxy_pass http://www.baidu.com;

h o s t : host: host:proxy_port = 百度ip:80
4. $http_host

proxy_set_header Host $http_host;

一个不会变化的“Host”头请求字段可通过如下方式被传递:

当请求 Header 里 Host 无值的时候,直接拿 server_name 的值进行填充。并加上端口。如果是 80/443 则不加。 其实就是去 请求url 里面的值。 http://server:port/v1
当请求 Header 里 Host 的值的时候,就直接拿 请求 Header 里面的 Host 的值。
示例

服务端: 192.168.2.189
服务端1:192.168.1.180 Nginx1
服务端2:192.168.1.90 Nginx2
image
基础配置
192.168.1.180 Nginx1
server{
listen 80;
server_name www.djx.com;

location / {
    proxy_pass http://www.baidu.com/;
}

}
192.168.1.190 Nginx2
server{
listen 80;
server_name www.baidu.com;

location / {
    proxy_pass http://192.168.1.80:8080/;
}

}
** 使用基础配置 **
也就是
proxy_set_header Host $proxy_host;
那么到 http://192.168.1.80:8080/ header 的值为 www.baidu.com.
** 使用 $host **
也就是
proxy_set_header Host $host;
参考文章:https://cloud.tencent.com/developer/article/1557504
作者:理想三旬
出处:https://www.cnblogs.com/operationhome/p/14232793.html
如果觉得文章写得不错,或者帮助到您了,请点个赞,加个关注哦。运维学习交流群:544692191
本文版权归作者所有,欢迎转载,如果文章有写的不足的地方,或者是写得错误的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。
分类: nginx
好文要顶 关注我 收藏该文
自由早晚乱余生
关注 - 17
粉丝 - 165
推荐博客
+加关注
0 0
« 上一篇: pinpoint 问题解决
posted @ 2021-01-04 22:15 自由早晚乱余生 阅读(70) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻

相关博文:
· Nginx404NotFound解决办法
· nginx配置Tp5项目时出现404NotFoundnginx
· ProxyReflect
· nginxproxy大文件上传失败问题总结
· charles开启Charles-Proxy-macOSProxy时报错
» 更多推荐…

最新 IT 新闻:
· 蛋壳之后,房企们能否成为长租公寓的“解药”?
· 高通骁龙480发布:采用8nm工艺 处理器性能相比上一代翻倍
· 第九城市股价涨逾50%触发熔断,公告称将开展数字货币业务
· 不造整车造部件 华为驾车向何方?
· NASA回顾2020年在国际空间站上进行的关键实验
» 更多新闻…
历史上的今天:
2020-01-04 Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本

公告

昵称: 自由早晚乱余生
园龄: 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(11)
Pinpoint(6)
python(6)
更多
随笔档案

2021年1月(1)
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)
更多
最新评论

  1. Re:Pinpoint 设置微信或者钉钉预警
    @自由早晚乱余生 请教下,现在这样只能每个服务单独设置告警规则,很多应用服务每个都单独设置规则,很繁琐重复,有没有对所有监控的应用服务批量设置告警规则…
    –liucx
  2. Re:Pinpoint 设置微信或者钉钉预警
    @liucx 批量告警是啥?…
    –自由早晚乱余生
  3. Re:Pinpoint 设置微信或者钉钉预警
    大佬请教下怎么批量设置告警

–liucx
4. Re:centos7 Mariadb5.5升级到Mariadb10.2
@自由早晚乱余生 关注了…
–lizhenlzlz
5. Re:Pinpoint系列文章目录
@jmacro 使用Hbase2 版本需要注意,要重新编译然后加上指定参数才可以使用。…
–自由早晚乱余生
阅读排行榜

  1. centos7搭建postfix邮件服务器(50163)

  2. 群晖MyDS账号注册–实现使用QuickConnect外网访问(41159)

  3. tomcat 日志详解(38421)

  4. MongoDB 常用的几大GUI工具(34949)

  5. python中不可变数据类型和可变数据类型(33374)

  6. linux ping 命令解析(32147)

  7. windows设置多用户模式(30496)

  8. nginx 超时问题: upstream timed out (110: Connection timed out) while reading response header from upstream(27930)

  9. 127.0.0.1和0.0.0.0和本机IP的区别(26318)

  10. expect安装和使用(23132)
    评论排行榜

  11. centos7搭建postfix邮件服务器(12)

  12. python中不可变数据类型和可变数据类型(7)

  13. freepbx对接gms网关(6)

  14. Pinpoint系列文章目录(5)

  15. MongoDB从入门到优化(5)
    推荐排行榜

  16. Docker容器日志管理最佳实践(37)

  17. python中不可变数据类型和可变数据类型(23)

  18. 博客园博客背景设置css与js(18)

  19. centos7搭建postfix邮件服务器(16)

  20. HTTP2.0学习 与 Nginx和Tomcat配置HTTP2.0(13)
    Copyright © 2021 自由早晚乱余生
    Powered by .NET 5.0 on Kubernetes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值