解决Nginx 配置 proxy_pass 后 返回404问题


Posted in Servers onMarch 31, 2021

一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位

1.1、 问题

在一次生产涉及多次转发的配置中, 需求是下面的图: 解决Nginx 配置 proxy_pass 后 返回404问题
在配置好了 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

解决Nginx 配置 proxy_pass 后 返回404问题

当我们是这个的设置的时候,当第一层 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 的不一致导致的。

解决Nginx 配置 proxy_pass 后 返回404问题

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. $host:$proxy_port

proxy_set_header Host  $host:$proxy_port;

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

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

$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

解决Nginx 配置 proxy_pass 后 返回404问题

基础配置
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

到此这篇关于Nginx 配置 proxy_pass 后 返回404问题的文章就介绍到这了,更多相关Nginx 配置 proxy_pass 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx优化的六点方法
Mar 31 Servers
Nginx配置Https安全认证的实现
May 26 Servers
配置nginx 重定向到系统维护页面
Jun 08 Servers
idea下配置tomcat避坑详解
Apr 12 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Linux服务器离线安装 nginx的详细步骤
Jun 16 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
详解ZABBIX监控ESXI主机的问题
Jun 21 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 Servers
Nginx如何配置多个服务域名解析共用80端口详解
Sep 23 Servers
教你使用Ubuntu搭建DNS服务器
Sep 23 Servers
nginx配置ssl实现https的方法示例
Mar 31 #Servers
Nginx解决前端访问资源跨域问题的方法详解
Mar 31 #Servers
nginx实现发布静态资源的方法
Nginx中break与last的区别详析
nginx网站服务如何配置防盗链(推荐)
本地通过nginx配置反向代理的全过程记录
nginx优化的六点方法
Mar 31 #Servers
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python中的set实现不重复的排序原理
2018/01/24 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python实现关键词提取的示例讲解
2018/04/28 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
python操作excel让工作自动化
2019/08/09 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
python3中sys.argv的实例用法
2020/04/24 Python
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
市场营销专业推荐信
2013/11/03 职场文书
语文教学感言
2014/02/06 职场文书
企业党员一句话承诺
2014/05/30 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
个人培训总结
2015/03/05 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python