Nginx 故障排查之斜杠(/) --(附 Nginx 常用命令)

问题场景:

项目中用到了多个子域名,测试环境通过子域名进行接口访问的时候返回 404 NOT_FOUND,经过排查测试后确定是 Nginx 配置问题,而导致事故的根本原因是运维在Nginx配置的时候少配置了一个斜杠(/),下面我们来聊聊具体情况。

故障现象如下:

nginx 配置如下:

 location /api/{
       client_max_body_size 100m;
       proxy_connect_timeout 120;
       proxy_send_timeout 120;
       proxy_read_timeout 120;
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header REMOTE-HOST $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://10.xxx.xxx.xxx:8080/api;
    }

接口请求结果如下:

在这里插入图片描述
{
“code”: 404,
“message”: “404 NOT_FOUND”,
“data”: “”
}

问题分析:

  • 接口不存在,直接通过服务部署的机器,通过 ip + 端口访问,正常响应。
  • 网关 Gateway 有问题,通过 Gateway 服务部署的机器,通过 ip + 端口访问,正常响应。
  • Nginx 配置有问题,通过 Nginx 的机器IP和暴露的端口去访问,响应 404,基本可以确定Nginx 配置有问题

原因分析:

  • 通过对问题现象分析,我们基本确定是 Nginx 配置的问题,我们取查询 Nginx 的日 看是否可以找到有效信息,没有找到有用信息。
  • 接着我们对 Gateway 日志进行分析,看看是否可以找到有用的信息,我们发现了这样一段日志, /apidxx/v1/szzz/method(真实接口路径不方便暴露,请理解),apidxx 这段有明显问题,api 后面应该有个斜杆 / ,才接着是 dxx 才对,这段日志是在 Gateway 发现的,再次证明是 Nginx 配置的问题,现在我们进一步确定了是少了个斜杠 /,已经确定到了问题,现在去排查 Nginx 配置即可。

分析 Nginx 配置:

我们发现 proxy_pass http://10.xxx.xxx.xxx:8080/api 这段配置在api 后面没有接斜杠 / ,对比我们上面的分析,果断加上斜杠试试,重启后问题解决,正确的 Nginx 配置如下:

location /api/{
      client_max_body_size 100m;
      proxy_connect_timeout 120;
      proxy_send_timeout 120;
      proxy_read_timeout 120;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://10.xxx.xxx.xxx:8080/api/;
   }

问题解决了,下面我们来分析一下,斜杠的各种场景。

location、proxy_pass 斜杠分析:

以下分析,不在赘述验证流程,感兴趣的朋友可以自己去验证,也欢迎提出疑问。
虚拟场景:我们需要通过 Nginx 代理访问地址:http://127.0.0.1/api/zt/app/list。

location加斜杠,proxy_pass 加api(上面分析的案例),如下:

location /api/ {
    proxy_pass http://127.0.0.1:8888/api;
}

实际访问地址 :http://127.0.0.1:8888/apizt/app/list,这是个错误的地址,apizt 之间少了斜杠 /,导致 404。

location 不加斜杠,proxy_pass 加 api,api后面不加斜杠 /,如下:

location /api {
    proxy_pass http://127.0.0.1:8888/api;
}

实际访问地址 :http://127.0.0.1:8888/api/zt/app/list,地址正确。

location 不加斜杠,proxy_pass 加 api,api后面加斜杠 /,如下:

location /api {
    proxy_pass http://127.0.0.1:8888/api/;
}

实际访问地址 :http://127.0.0.1:8888/api/zt/app/list,地址正确。

location 加斜杠,proxy_pass 加 api,api后面加斜杠 /,如下:

location /api/ {
    proxy_pass http://127.0.0.1:8888/api/;
}

实际访问地址 :http://127.0.0.1:8888/api/zt/app/list,地址正确。

location 不加斜杠,proxy_pass 不加 api,如下:

location /api {
    proxy_pass http://127.0.0.1:8888;
}

实际访问地址 :http://127.0.0.1:8888/api/zt/app/list,地址正确。

location 加斜杠,proxy_pass 不加 api,如下:

location /api/ {
    proxy_pass http://127.0.0.1:8888;
}

实际访问地址 :http://127.0.0.1:8888/api/zt/app/list,地址正确。

location 加斜杠,proxy_pass 不加 api,如下:

location /api {
    proxy_pass http://127.0.0.1:8888/;
}

实际访问地址 :http://127.0.0.1:8888//api/zt/app/list,地址错误

总结:

我们发现 proxy_pass 基本可以分为两种配置方法,一种是代理地址端口无字符,另外一种则是代理地址端口后有字符,下面给出结论:

  • proxy_pass 代理地址端口后无任何字符,转发后实际地址:代理地址+访问URL接口路径部分。
  • proxy_pass 代理地址端口后有目录(包括 / ),转发后实际地址:代理地址+访问URL目录部分去除location匹配目录。

Nginx常用命令:

#查看Nginx 进程命令
ps aux|grep nginx
#优雅停止Nginx服务器命令
/data/svr/nginx/sbin/nginx -s quit
启动Nginx服务器命令(Nginx 很多命令都是在 sbin 目录下执行)
去到sbin路径:cd /usr/local/nginx/sbin
启动Nginx服务器: ./nginx
#修改配置后检查配置文件是否出错
/data/svr/nginx/sbin/nginx -t
#修改配置后热加载
/data/svr/nginx/sbin/nginx -s reload
#指定启动配置文件命令
/data/svr/nginx/sbin/nginx -c /data/svr/nginx/conf/nginx.conf
#暴力停止Nginx服务器命令
/data/svr/nginx/sbin/nginx -s stop
#优雅停止Nginx服务器命令
/data/svr/nginx/sbin/nginx -s quit

如有不正确的地方欢迎各位指出纠正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt播放音乐代码示例

主界面 点击play按钮播放或暂停音乐,拖动进度条,音乐对应播放。 QWidget window;QPushButton* playButton new QPushButton("Play");// Qt 播放音乐// 创建 QMediaPlayer 对象QMediaPlayer* player new QMediaPlayer;// 指定音频文件的路径…

【IIS】应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。

应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。 发现其他网站是正常访问,对比发现路径凭据身份差异,这个网站指定用户访问,因为是物理机P2V到虚拟机上的。调整为应用程序用户,…

双系统安装04--在已有统信UOS基础上安装Windows10

原文链接:双系统安装04–在已有统信UOS基础上安装Windows10 Hello,大家好啊!继我们之前的双系统安装系列文章之后,今天我非常高兴地为大家介绍双系统安装的第四篇——在已有的统信桌面操作系统上安装Windows 10。这对于那些希望在…

k8s笔记27--快速了解 k8s pod和cgroup的关系

k8s笔记27--快速了解 k8s pod和 cgroup 的关系 介绍pod & cgroup注意事项说明 介绍 随着云计算、云原生技术的成熟和广泛应用,K8S已经成为容器编排的事实标准,学习了解容器、K8S技术对于新时代的IT从业者显得极其重要了。 之前在文章 docker笔记13–…

Excel通过下拉菜单,显示不同图片

背景:有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup,这个可以很简单的实现这个功能。(这个如果不知道请自行百度) 但是如果是图片呢?这个就不常见了,那么…

我的创作纪念日——命运之光来到CSDN的第365天

目录 前言 机缘 最初成为创作者的初心 实战项目中的经验分享 日常学习过程中的记录 通过文章进行技术交流 收获 在创作的过程中都有哪些收获 获得了多少粉丝的关注 获得了多少正向的反馈,如赞、评论、阅读量等 认识和哪些志同道合的领域同行 日常 当前创…

走迷宫----bfs再矩阵图里的应用模版

对于之前走迷宫的那个题 回忆一下dfs的代码 #include <bits/stdc.h> using namespace std; int a[110][110]; bool check[110][110]; int n,m; int ans1e9; int nxt[4][2]{{1,0},{0,-1},{-1,0},{0,1}}; void dfs(int x,int y,int step){if(xn&&ym){ansmin(ans,…

增强现实(AR)在广告中的力量

The Power of AR in Advertising 写在前面 增强现实&#xff08;AR -Augmented Reality&#xff09;是指借助软件、应用程序和智能手机、平板电脑或耳机等设备&#xff0c;为日常生活添加视觉和音频元素的技术。如今&#xff0c;品牌和广告商可以在营销活动中使用AR&#xff0…

解放双手,自动引流——客户主动找上门

流量问题&#xff0c;无论是在实体行业还是互联网行业&#xff0c;都是一个普遍存在的难题。 只有拥有源源不断的庞大流量&#xff0c;才能更好地进行商业变现与发展。那么&#xff0c;是否存在一款全自动挂机引流的软件呢&#xff1f;答案是肯定的。接下来&#xff0c;我将根…

C++面向对象三大特征-----继承(详细版)

目录 继承 一、继承的基础介绍 普通版网页和继承版网页的区别 语法 二、继承方式 三种继承方式 三、继承中的对象模型 四、继承中构造和析构函数 五、继承同名成员的处理方式 访问同名成员&#xff1a; 作用域写法&#xff1a; 六、继承同名静态成员的处理方式 访问…

【算法每日一练]

目录 今日知识点&#xff1a; 辗转相减法化下三角求行列式 组合数动态规划打表 约数个数等于质因数的次方1的乘积 求一个模数 将n个不同的球放入r个不同的盒子&#xff1a;f[i][j]f[i-1][j-1]f[i-1][j]*j 将n个不同的球放入r个相同的盒子&#xff1a;a[i][j]a[i-j][j]a[…

Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器

一、前言 在安防视频监控行业&#xff0c;Onvif作为国际标准&#xff0c;几乎主要的厂商都支持&#xff0c;不仅包含了国内的厂商&#xff0c;也包括主要的国际厂商&#xff0c;由于有了这个标准的存在&#xff0c;使得不同设备不同安防平台之间&#xff0c;能够接入各个厂家的…

湖北专升本报名照片需要<40kb怎么解决

湖北专升本报名照片需要<40kb怎么解决

[ C++ ] STL---反向迭代器的模拟实现

目录 前言&#xff1a; 反向迭代器简介 list反向迭代器的模拟实现 反向迭代器的模拟实现(适配器模式) SGI版本STL反向迭代器源码 STL库中解引用操作与出口设计 适配list的反向迭代器 适配vector的反向迭代器 前言&#xff1a; 反向迭代器是一种特殊类型的迭代器&#xf…

微信小程序 - picker-viewer实现省市选择器

简介 本文会基于微信小程序picker viewer组件实现省市选择器的功能。 实现效果 实现代码 布局 <picker-view value"{{value}}" bindchange"bindChange" indicator-style"height: 50px;" style"width: 100%; height: 300px;" &…

车道线检测论文:《Ultra Fast Structure-aware Deep Lane Detection》

该论文标题为《Ultra Fast Structure-aware Deep Lane Detection》&#xff0c;作者是浙江大学计算机科学与技术学院的Zequn Qin、Huanyu Wang和Xi Li。论文提出了一种新颖的、简单而有效的车道检测方法&#xff0c;旨在解决具有挑战性场景下的车道检测问题&#xff0c;并实现极…

java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. hash统计出现次数后排序2. 桶排序 1. hash统计出现次数后排序…

基于Springboot的牙科就诊管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的牙科就诊管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍: 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c…

<Linux> 线程池

目录 前言&#xff1a; 一、线程池概念 &#xff08;一&#xff09;池化技术 &#xff08;二&#xff09;优点 &#xff08;三&#xff09;应用场景 二、线程池的实现 &#xff08;一&#xff09;线程池_V1&#xff08;朴素版&#xff09; &#xff08;二&#xff09;线…

GaussDB WDR分析之集群报告篇

AWR报告目前已经成为Oracle DBA分析问题&#xff0c;定位故障最为重要的报告&#xff0c;阅读与分析AWR报告的技能也是Oracle DBA必备的技能。国产数据库为了提高运维便捷性&#xff0c;都在做类似Oracle AWR报告的模仿&#xff0c;只不过由于指标体系不够完善&#xff0c;因此…