解决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配置访问wgcloud的方法
Jun 26 Servers
nginx服务器的下载安装与使用详解
Aug 02 Servers
Nginx动静分离配置实现与说明
Apr 07 Servers
阿里云日志过滤器配置日志服务
Apr 09 Servers
Nginx+Tomcat负载均衡多实例详解
Apr 11 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
Windows Server 2012 修改远程默认端口3389的方法
Apr 28 Servers
Windows Server 2012配置DNS服务器的方法
Apr 29 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
SpringBoot前端后端分离之Nginx服务器下载安装过程
Aug 14 Servers
服务器nginx权限被拒绝解决案例
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
PHP学习之数组的定义和填充
2011/04/17 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
简单理解Python中基于生成器的状态机
2015/04/13 Python
python 中random模块的常用方法总结
2017/07/08 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
小学端午节活动方案
2014/03/13 职场文书
求职信格式要求
2014/05/23 职场文书
单位委托书怎么写
2014/08/02 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
初中信息技术教学反思
2016/02/16 职场文书