记录一次 Nginx 配置 proxy_pass 后 返回404问题
一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位
1.1、 问题
在一次生产涉及多次转发的配置中, 需求是下面的图: 
在配置好了 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(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 的不一致导致的。

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

基础配置
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
nginx配置proxy_pass,需要注意转发的路径配置 1.location /test/ { proxy_pass http://t6:8300; } 2.location /test/ { p ...
- Nginx配置proxy_pass转发的/路径问题
Nginx配置proxy_pass转发的/路径问题 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则 ...
- Nginx配置proxy_pass【转载】
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 下面四种 ...
- Nginx配置proxy_pass转发/路径问题
proxy_ignore_client_abort on; #不允许代理端主动关闭连接 upstream的负载均衡,四种调度算法 #调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果 ...
- nginx location proxy_pass 后面的url 加与不加/的区别
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 首先是l ...
- nginx 配置proxy_pass URL末尾加与不加/(斜线)的区别
nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项 假设访问路径的 /pss/bill.html 加/斜线的情况 location /pss/ { proxy_p ...
- nginx配置proxy_pass URL末尾加与不加/(斜线)的区别
nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项 假设访问路径的 /pss/bill.html 加/斜线的情况 location /pss/ { proxy_p ...
- 记录一次nginx配置vhost的小bug
话说这篇博客是在是为了保持自己记录生活的习惯而写的,没有什么阅读的价值,各位读者可以直接忽略了.今天在配置一个域名的时候,写了new_example.com(举例而已) 因为是内测,所以并未想象到深层 ...
- Nginx配置proxy_pass转发的/路径
请求原地址 :http://servername/static_js/test.html location ^~ /static_js/ { proxy_cache js_cache; proxy_s ...
随机推荐
- 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)
1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...
- python菜鸟教程学习10:数据结构
列表方法 list.append(x):把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]. list.extend(L):通过添加指定列表的所有元素来扩充列表,相当于 a[len( ...
- 半夜删你代码队 Day4冲刺
一.每日站立式会议 1.站立式会议 成员 昨日完成工作 今日计划工作 遇到的困难 陈惠霖 做了新规划 开始双人合作 无 侯晓龙 写了第一个例子 开始双人合作 无 周楚池 准备合作 开始双人合作 无 胡 ...
- AcWing 326. XOR和路径
大型补档计划 题目链接 如果整体来做,发现既有加法,也有整体异或,这样不容易搞. 考虑异或,各个位置互不干扰,按位考虑一下. 枚举每一位 \(k\) 发现如果设 \(f[u]\) 为这一位的期望结果还 ...
- 题解-CF1140E Palindrome-less Arrays
CF1140E Palindrome-less Arrays \(n\) 和 \(k\) 和 \(n\) 个数的序列 \(a\).把 \(a\) 中的 \(-1\) 替换成 \([1,k]\) 之间的 ...
- fabric智能合约模板
以创建用户为例,我觉得基本都是这个框架,用特殊功能直接再往上加,欢迎留言交流 func createUser(stub shim.ChaincodeStubInterface, args []stri ...
- 第一章、Docker 简介
笔记内容来自:第一本Docker书 [澳] James Turnbull 著 李兆海 刘斌 巨震 Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎.(由Docker 公司,前dot ...
- 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)
图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...
- Typora+图床详解(小白都能学得会)
Typora+图床详解(小白都能学得会) 1 了解工作 博客中用的笔记软件--Typora(Markdown语法) 博客中用的图床--阿里云对象存储(Object Storage Service,简称 ...
- UML—20—001
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...