解决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请求实现过程解析
Mar 31 Servers
nginx基于域名,端口,不同IP的虚拟主机设置的实现
Mar 31 Servers
Nginx Rewrite使用场景及配置方法解析
Apr 01 Servers
Nginx源码编译安装过程记录
Nov 17 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
nginx常用配置conf的示例代码详解
Mar 21 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
Nginx 安装SSL证书完成HTTPS部署
Apr 28 Servers
CentOS7环境下MySQL8常用命令小结
Jun 10 Servers
windows系统安装配置nginx环境
Jun 28 Servers
源码安装apache脚本部署过程详解
Sep 23 Servers
码云(gitee)通过git自动同步到阿里云服务器
Dec 24 Servers
nginx配置ssl实现https的方法示例
Mar 31 #Servers
Nginx解决前端访问资源跨域问题的方法详解
Mar 31 #Servers
nginx实现发布静态资源的方法
Nginx中break与last的区别详析
nginx网站服务如何配置防盗链(推荐)
本地通过nginx配置反向代理的全过程记录
nginx优化的六点方法
Mar 31 #Servers
You might like
19个超实用的PHP代码片段
2014/03/14 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP培训要多少钱
2017/06/06 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
jquery表单验证使用插件formValidator
2012/11/10 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
3种vue组件的书写形式
2017/11/29 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
js实现录音上传功能
2019/11/22 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
python之yield表达式学习
2014/09/02 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
解决python运行效率不高的问题
2020/07/20 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
八一建军节感言
2014/02/28 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
安装工程师岗位职责
2015/02/13 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
协议书格式模板
2016/03/24 职场文书