首页 > 系统相关 >Nginx 故障排查之斜杠(/) --(附 Nginx 常用命令)

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

时间:2024-03-24 21:59:45浏览次数:22  
标签:http -- Nginx api proxy 斜杠 pass

问题场景:

项目中用到了多个子域名,测试环境通过子域名进行接口访问的时候返回 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

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

标签:http,--,Nginx,api,proxy,斜杠,pass
From: https://blog.csdn.net/weixin_42118323/article/details/136966571

相关文章

  • 登山小分队(dfs,模拟)
    原题链接:题目描述Foxity和他的好友们相约去爬山,但是他们每个人都来到了不同的山脚下。整个山的结构类似一棵"树",有很多的观光节点通过一条条山道连接起来。在图论中,树是一种无向图,其中任意两个顶点之间存在唯一一条路径。或者说,只要没有回路的连通图就是树。这个问题中,我们......
  • 3.24每日总结
    activitydurationdependsonresourcetypeA2days SAB10daysASDC2daysASDD2daysCSCE3daysCSCF2daysCSCG4daysB,D,E,FSAactivity  durationdepen......
  • Link with Monotonic Subsequence(分块,思维)
    First,let'sreviewsomedefinitions.Feelfreetoskipthispartifyouarefamiliarwiththem.Asequence aaaisanincreasing(decreasing)subsequenceofasequence bbbif aaacanbeobtainedfrom bbbbydeletionofseveral(possibly,zeroorall)......
  • nginx入门-31-学习笔记
    nginx入门-31-学习笔记环境环境:虚拟机ip:10.0.1.0网关:10.0.1.2子网掩码:255.255.255.0测试机器ip:10.0.1.101概念1.安装nginx软件安装:yum安装yuminstallepel-releaseyuminstallnginx-ysystemctlstartnginx编译安装(生产环境)yum-yinstallpcr......
  • ONNX 的简介及应用
    文章目录一、ONNX是什么二、ONNX具备哪些功能三、ONNX的相关概念四、ONNX的应用领域一、ONNX是什么ONNX(OpenNeuralNetworkExchange)是一种开放的深度学习模型交换格式,类似于JSON格式。它允许将模型从一个深度学习框架转换到另一个框架,以便在不同的平台和设备......
  • 综合架构--7--网站搭建--35
    综合架构--网站搭建--35环境环境:虚拟机ip:10.0.1.0网关:10.0.1.2子网掩码:255.255.255.0测试机器ip:10.0.1.101tips:机器不可以有nginx,所以这里建议你重新开个新机器或者克隆一个模版机1LNMP架构是什么?静态网站:.htmlhtmjpgmp4动态网站:.php.jsp......
  • 【JavaWeb】Day19.Vue组件库Element——常见组件
    一.Element常见组件-表格Table表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。首先打开官网找到表格(Element-Theworld'smostpopularVueUIframework)以带边框表格为例,点击显示代码把代码复制到自己的vue项目中点击npm脚本运行,......
  • FreeType Glyph Conventions 翻译(2) ——Glyph Outlines 字符图形轮廓线
    原文地址https://freetype.org/freetype2/docs/glyphs/glyphs-2.html目录像素,点,以及设备分辨率Pixels,points,anddeviceresolutions矢量表示VectorialrepresentationHintingandBitmaprendering启发和位图渲染Thissectiondescribesthewayscalablerepresentatio......
  • 【JavaWeb】Day18.Vue组件库Element
    什么是ElementElement:是饿了么团队研发的,一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。组件:组成网页的部件,例如超链接、按钮、图片、表格、表单、分页条等等。官网:Element-Theworld'smostpopularVueUIframeworkElement快速入门安装ElementUI......
  • 第四百二十二回
    文章目录1.概念介绍2.思路与方法2.1实现思路2.2实现方法3.示例代码4.内容总结我们在上一章回中介绍了"自定义标题栏"相关的内容,本章回中将介绍自定义Action菜单.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在这里提到的Action菜单是指AppBar中actio......