解决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 502 Bad Gateway错误原因及解决方案
Mar 31 Servers
提升Nginx性能的一些建议
Mar 31 Servers
使用nginx配置访问wgcloud的方法
Jun 26 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
Apache Pulsar集群搭建部署详细过程
Feb 12 Servers
Minikube搭建Kubernetes集群
Mar 31 Servers
使用Nginx的访问日志统计PV与UV
May 06 Servers
Nginx 常用配置
May 15 Servers
教你如何用cmd快速登录服务器
Jun 10 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
win7配置本地ftp服务器的图文教程
Aug 05 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中上传多个文件的表单设计例子
2014/11/19 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
js实现表格数据搜索
2020/08/09 Javascript
node.js基础知识汇总
2020/08/25 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
Python生成随机密码的方法
2017/06/16 Python
python求最大连续子数组的和
2018/07/07 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
python同时替换多个字符串方法示例
2019/09/17 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
Python下载的11种姿势(小结)
2020/11/18 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
战友聚会邀请函
2014/01/18 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
python获取带有返回值的多线程
2022/05/02 Python