解决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 比 Apache 更牛逼
Mar 31 Servers
Nginx优化服务之网页压缩的实现方法
Mar 31 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
Nginx缓存设置案例详解
Sep 15 Servers
Windows server 2012 配置Telnet以及用法详解
Apr 28 Servers
Windows Server 2016 配置 IIS 的详细步骤
Apr 28 Servers
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 Servers
Nginx限流和黑名单配置
May 20 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
GPU服务器的多用户配置方法
Jul 07 Servers
Nginx文件已经存在全局反向代理问题排查记录
Jul 15 Servers
彻底卸载VMware虚拟机的超详细步骤记录
Jul 15 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电台频率大全 - 22 重庆市
2020/03/11 无线电
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
python中cPickle用法例子分享
2014/01/03 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
python抽取指定url页面的title方法
2018/05/11 Python
Python continue继续循环用法总结
2018/06/10 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
校园绿化美化方案
2014/06/08 职场文书
上海世博会口号
2014/06/19 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
团员个人总结
2015/02/26 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS