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

12 篇文章 0 订阅
5 篇文章 0 订阅
文章讲述了作者在配置Nginx的auth_request时遇到504错误,通过排查日志、网络抓包发现是由于子请求中Content-length设置错误导致的。解决方法是重置子请求的Content-length为0。
摘要由CSDN通过智能技术生成

看到 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:''.

站长工具功能简介 1、JS加密/解密(将代码以js形式进行加密或解密。) 2、UTF-8编码转换工具(UTF-8编码转换。) 3、Unicode编码转换工具(Unicode编码转换。) 4、友情链接(通过本工具可以批量查询指定网站的友情链接在百度的收录、百度快照、PR以及对方是否链接本站,可以识破骗链接。) 5、META信息检测(通过本工具可以快速检测网页的META标签,分析标题、关键词、描述等是否有利于搜索引擎收录。) 6、MD5加密工具(对字符串进行MD5加密。) 7、sfz号码值查询(查询sfz所在地、性别及出生日期。) 8、HTML/UBB代码转换工具(HTML/UBB代码转换。) 9、HTML/JS互转工具(HTML/JS互转。) 10、搜索蜘蛛、机器人模拟工具(通过本工具可以快速模拟搜索引擎蜘蛛访问页面所抓取到的内容信息!) 11、关键词密度检测(通过本工具可以快速检测页面关键词出现的数量和密度,更适合蜘蛛的搜索。) 12、国家域名查看(查看所有国家的域名。) 13、邮编区号查询(查询各地区的邮编及其区号,支持模糊查询。) 14、域名Whois查询工具(Whois简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。通过域名Whois查询,可以查询域名归属者联系方式,以及注册和到期时间。) 15、死链接检测/全站PR查询(通过本工具可以快速测试网站的死链接。死链接-也称无效链接,即那些不可达到的链接。一个网站存在死链接不是什么好事,首先一个网站如果存在大量的死链接,必将大大损伤网站的整体形象,再者搜索引擎蜘蛛是通过链接来爬行搜索,如果太多链接无法到达,不但收录页面数量会减少,而且你的网站在搜索引擎中的权重会大大降低。该查询可以遍历指定网页的所有链接,并分析每个链接的有效性,找出死链接。) 16、搜索引擎收录查询(通过本工具可以快速查询各大搜索引擎对网站的收录数量!) 17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!) 18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。) 19、SEO综合查询(SEO综合查询。) 20、PR值查询(PR值全称为PageRank(网页级别),取自Google的创始人LarryPage。它是Google排名运算法则(排名公式)的一部分,是Google用于用来标识网页的等级/重要性的一种方法,是Google用来衡量一个网站的好坏的唯一标准。在揉合了诸如Title标识和Keywords标识等所有其它因素之后,Google通过PageRank来调整结果,使那些更具“等级/重要性”的网页在搜索结果中令网站排名获得提升,从而提高搜索结果的相关性和质量。) 21、关键词排名查询(通过关键词排名查询,可以快速得到当前网站的关键字在Baidu/Google收录的排名情况!有些关键词在各地的排名是不一样的,就是通常说的关键字地区排名。比如:新闻、人才等很多。所以才提供多个地点的服务器提供大家查询。) 22、IP查询(通过该工具可以查询指定IP的物理地址或域名服务器的IP和物理地址,及所在国家或城市,甚至精确到某个网吧,机房或学校等;查出的结果仅供参考!) 23、Google收录查询(查询谷歌收录情况。) 24、友情链接查询工具(通过本工具可以批量查询指定网站的友情链接在百度的收录、百度快照、PR以及对方是否链接本站,可以识破骗链接。) 25、友情链接IP查询工具(通过本工具可以批量查询网站友情链接站点的IP地址、服务器物理地址,帮助站长清楚了解友情链接的服务器物理定位。) 26、域名删除查询(.com.net.org等国际域名删除时间,通常在域名到期后的第65或75天,凌晨2点30左右会删除国内域名的删除时间,通常在域名到期后的第15或16天,凌晨4:30会删除友情提示:域名删除时间仅供参考,谢谢!) 27、百度收录查询(本工具为站长提供指定时间内百度搜索对指定网站的收录情况,包括收录的网页数量和网页的具体情况,让您更好地掌握百度搜索对您的网站收录情况。) 28、PR输出值查询(查询网站的PR输出值,PR输出值:带给友情链接的PR值。计算公式:(1-0.85)+0.85*(PR值/外链数)。) 29、查看网页源代码(通过本工具可以快速查找指定网站的页面源代码。) 30、Unix时间戳(Unixtimestamp)转换工具(什么是Unix时间戳(Unixtimestamp):Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值