解决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 09 Servers
nginx反向代理时如何保持长连接
Mar 31 Servers
nginx location优先级的深入讲解
Mar 31 Servers
nginx限制并发连接请求数的方法
Apr 01 Servers
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
docker compose 部署 golang 的 Athens 私有代理问题
Apr 28 Servers
Windows server 2012 R2 安装IIS服务器
Apr 29 Servers
docker 制作mysql镜像并自动安装
May 20 Servers
项目中Nginx多级代理是如何获取客户端的真实IP地址
May 30 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
Nginx配置使用详解
Jul 07 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的图形函数中显示汉字
2006/10/09 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
python代码制作configure文件示例
2014/07/28 Python
批处理与python代码混合编程的方法
2016/05/19 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
python函数的5种参数详解
2017/02/24 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
三分钟英语演讲稿
2014/04/24 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
校外活动方案
2014/08/28 职场文书
施工安全保证书
2015/05/09 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL