记录由客户端http请求原因引起的5xx响应问题排查过程

看到 http 状态码 5xx,很多开发者第一感觉就是服务端的问题,其实并不全是。下面我遇到的问题就是一个例外。

问题描述

最近在为反向代理 nginx 配置 auth_request 后,出现了请求504错误。

504状态码是HTTP协议中的一种服务器错误状态码。当客户端向服务器发送请求并在一段时间内未收到服务器的有效响应时,就会返回504状态码。它表示服务器作为网关或代理,正在等待上游服务器返回响应,但在超时时间内未收到响应。

问题排查

1 排查nginx日志

查看 nginx 的错误日志,确实记录了504的错误记录,一起的还有另外一条 subrequest 的110 connection time out。

[error] 10641#10641: *2282366 upstream timed out (110: Connection timed out) while reading response header from upstream, request: "POST /test/?route=/ HTTP/1.1", subrequest: "/auth", upstream: "http://xxxxxxxxx/auth"
[error] 10641#10641: *2282366 auth request unexpected status: 504 while sending to client,request: "POST /test/?route=/ HTTP/1.1"

直觉看来就是subrequest请求的服务,没有正常工作造成请求没有响应。

然而当直接使用 curl 请求subrequest 请求的地址时,服务却是正常相应的。

2 排查subrequest请求的服务的日志

排查subrequest请求的服务的日志时候,发现了408的状态码。

"GET /nginx/?route=/ 408

408状态码是HTTP协议中的一个客户端错误状态码。它表示请求超时,即客户端发送的请求在服务器预设的等待时间内没有得到响应。服务器可以在响应中包含一个Retry-After头字段,指示客户端在多长时间之后可以重试请求。

这里可以肯定的是,subrequest,请求有问题。但是错误信息就这么多,仅通过日志无法排查出问题的原因。

3 既然日志无法定位问题,就tcpdump + wireshark来看看这个subrequest

日志中无法看出具体问题,就通过网络抓包工具,看看这次subrequest到底请求了什么?

tcpdump 抓取网络包

tcpdump -i interfacename port xxx -w capture.pcap

将上面的包使用wireshark导入,定位到有问题的stream,然后follow stream.
分析这次网络请求的过程如下:

  • 11~13帧是tcp的三次握手
  • 14号帧是客户端发送了请求
  • 15号帧服务端响应了内容长度为0的确认信息
  • 然后等待了10秒
  • 16~18号帧就是tcp的四次挥手过程

在这里插入图片描述
问题出在哪里?为什么中间等待了10秒?

10秒是客户端请求的超时配置,超过10秒后,客户端自己断开,从上面的挥手过程,和 408的状态码可以看出来。

在查看请求的具体信息时,见下图,发现了请求头Content-length: 153,这个有点意外,因为这个通常是在响应头中的数据。
在这里插入图片描述
既然怀疑这里,就将这个请求生成curl命令,直接在命令行中请求,确实会卡住,直到请求超时。

curl -XGET -vvv -H 'Content-length:153' 'http://127.0.0.1:8028/auth/'
Note: Unnecessary use of -X or --request, GET is already inferred.
* Expire in 0 ms for 6 (transfer 0x55e12cc5b110)
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55e12cc5b110)
* Connected to 127.0.0.1 (127.0.0.1) port 8028 (#0)
> GET /auth/ HTTP/1.1
> Host: 127.0.0.1:8028
> Accept: */*
> Content-length:153
>
* Empty reply from server
* Connection #0 to host 127.0.0.1 left intact

移除上面的Content-length后,重新请求,直接就返回了结果。
看来问题就是请求头中的:Content-length引起的。

4 问题分析

上面的请求中,并没带请求体,理论上请求体长度(Content-length)理应为0, 但是却发送了非0的 Content-length请求,也就是告诉服务端请求体长度为153, 然后服务端并没有收到请求体,就一直等待(一些服务会等待,有些服务直接返回错误)。

5 解决方案

问题分析出来,解决问题就比较容易了,在subrequest时,直接重置请求头中的Content-length, 比如设置为Content-length:''.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包(建议将解压到非C盘,路径不要出现特殊符号) 3.在MySQL主目录下,创建my.ini空文件(先创建一个txt文件,进…

如何改造现有文件为 CMD 模块

如何改造现有文件为 CMD 模块 经过一段考察,我们终于要在项目中引入模块机制和 Sea.js 了,那么如何将现有的文件改造成 CMD 模块就成了重要的问题。下面针对一些典型场景来说明包装的方式。 首先还是请大家详细了解下 CMD 模块定义规范,只要…

JavaScript删除数组中指定元素的5种方法

文章目录 目录 文章目录 前言 一、数组是什么? 二、讲解数组 总结 前言 在JavaScript开发中,处理数组是一项非常常见的任务。有时候我们需要从数组中删除特定的元素,以便对数组进行进一步操作或者满足特定的需求。幸运的是,JavaS…

Unity中URP下实现能量罩(外发光)

文章目录 前言一、实现菲涅尔效果1、求 N ⃗ \vec{N} N 2、求 V ⃗ \vec{V} V 3、得出菲涅尔效果4、得出菲涅尔相反效果5、增加菲涅尔颜色二、能量罩 交接处高亮 和 外发光效果结合1、修改混合模式,使能量罩透明2、限制 0 ≤ H i g h L i g h t C o l o r ≤ 1 0\leq HighL…

【字符串】贝贝的车牌问题(UPC)

题目描述 广州市车管所为每一辆入户的汽车都发放一块车牌,车牌的号码由六个字符组成,如A99452、B88888等,这个字符串从左边数起的第一个字符为大写英文字母,如A、B、C等,表示这辆车是属于广州市区内的汽车还是郊区的汽…

Swoft - Bean

一、Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。 最直观的感受就是省去了频繁new的过程,节省了资源的开销。 二、Bean的使用 1、创建Bean 在【gateway/app/Http/Controller】下新建一个名为…

7.vue学习笔记(模板引用+组件组成+组件嵌套关系)

文章目录 1.模板引用2.组件组成3.组件嵌套关系3.1.App.vue3.1.1.Header.vue3.1.2.Main.vue3.1.3.Aside.vue 1.模板引用 在Vue直接读取DOM 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作(事件,内容,属性), …

持久双向通信网络协议-WebSocket-入门案例实现demo

1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 HTTP协议和WebSocket协议对比: HTTP是短连接&#xff0…

Edge 浏览器设置自动刷新

要在 Microsoft Edge 浏览器中设置自动刷新,您可以使用第三方扩展来实现这一功能。目前,Edge 浏览器本身并没有内置的自动刷新功能。以下是启用自动刷新的一般步骤: 打开 Microsoft Edge 扩展商店:首先,在 Edge 浏览器…

【MATLAB】小波_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波-LSTM神经网络时序预测算法是一种结合了小波变换和长短期记忆神经网络(LSTM)的时间序列预测方法。 小波变换是一种信号处理方法,能够将信号分解为…

Postman应用打开超级慢解决办法

电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DI…

<蓝桥杯软件赛>零基础备赛20周--第14周--BFS

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上交流答疑&am…

发布_Windows系统服务器发布Java程序

windows服务器发布Java程序 一般来说再Windows服务器上发布就直接使用cmd,然后使用javaw -jar ****.jar但是使用这种方法有两种环境同时再此服务器上时(生产环境和测试环境),直接再任务管理器中杀死javaw进程就会混乱&#xff0c…

【嵌入式——C++】基础知识

【嵌入式——C】基础知识 变量作用域局部作用域全局作用域块作用域类作用域 常量标识符命名规则数据的输入运算符算术运算符赋值运算符比较运算符逻辑运算符 变量作用域 局部作用域 在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每…

2085. 统计出现过一次的公共字符串

提示 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 ["leetcode","is","amazing","as","is"], words2 [&qu…

NowinAndroid—2024 Android现代开发全功能应用

NowinAndroid—2024 Android现代开发全功能应用 现代Android开发全功能示例应用Now-in-Android,它是用Kotlin和Jetpack Compose开发的,功能非常强大。这个应用遵循了安卓设计和开发的最佳方法,旨在给开发者提供实用的参考资料。无论你是新手…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块一

竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 1.第一阶段:模块一 网络平台搭建与设备安全防护(180 分钟,300 分)。 2.第二阶段:模块二…

002 Golang-channel-practice

第二题: 创建一个生产器和接收器,再建立一个无缓冲的channel。生产器负责把数据放进管道里,接收器负责把管道里面的数据打印出来。这里我们开5个协程把数据打印出来。 直接上代码! package mainimport ("fmt" )func …

个人猜测:关于《矩阵论》中的QR分解为什么用Q来表示正交矩阵(orthogonal matrix )

为什么QR分解用Q来表示正交矩阵(orthogonal matrix )? 搜过Google,问过ChatGPT, 什么说是约定俗成,什么说是历史原因,都没有一个合理的解释。 都没有准确的答案, 下面这两个链接…

“人工智能”领域的高含金量证书接受报名!

由国家工信部权威认证的人工智能证书是跨入人工智能行业的敲门砖,随着人工智能技术的发展越来越成熟,相关的从业人员也会剧增,证书的考取难度也会变高。如果已经从事或者准备从事人工智能行业的人员,对于考证宜早不宜迟&#xff0…