解决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如何将http访问的网站改成https访问
Mar 31 Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 Servers
nginx服务器的下载安装与使用详解
Aug 02 Servers
教你快速构建一个基于nginx的web集群项目
Nov 27 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
CentOS下安装Jenkins的完整步骤
Apr 07 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
nginx访问报403错误的几种情况详解
Jul 23 Servers
Nginx如何限制IP访问只允许特定域名访问
Jul 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
?繁体转换的class
2006/10/09 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
python关键字and和or用法实例
2015/05/28 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python入门教程 python入门神图一张
2018/03/05 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
商铺租赁意向书
2014/04/01 职场文书
团代会宣传工作方案
2014/05/08 职场文书
公路绿化方案
2014/05/12 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
机关工会工作总结2015
2015/05/26 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python