百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

多亏了这几个工具,搞定了http接口偶发415的问题

off999 2025-03-01 15:07 23 浏览 0 评论

推荐阅读:

近期接到一个同学的反馈说,他负责的C工程在小概率的情况下SpringMvc会返回415,通过输出的日志发现请求头里面并没有content-type了,所以才导致SpringMvc返回415,他猜测可能是我在nginx这边加的lua脚本给影响了(我们用lua脚本做了一些灰度跳转的逻辑),虽然我心里很清楚lua这块并没有修改请求头的逻辑,但是没办法,嘴上说说并不能服众,我需要拿出证据自证清白。

第一把斧亮相:

既然是说lua把请求头给改了,那把content-type输出来看看不就完事了。很简单,直接修改nginx access日志的log_format即可,在原有的基础上增加$http_content_type。就这样很快加完了,那就开始守株待兔吧,运气还不错,几分钟以后就命中一个415的请求,查看access日志里记录的content-type值,一点问题没有,就是我们熟悉的那个“application/json”,这一刻心里窃喜“不是哥的问题,回邮件该干啥干啥了”。

第二把斧亮相:

半天过后负责Resin(一种web服务器,和Tomcat差不多)的同学找到了我,猜测可能是请求头里面有某些特殊字符导致请求头的解析发生了问题,所以请求头乱了,请看下面这张图,仔细找找其实是能找到content-type的。

话到这里我已经知道他要干什么了,给我几分钟我想想办法,既然怀疑是特殊字符导致那我就将所有的头信息都打印出来,查了一下lua-nginx-module的使用手册,有一个声明叫log-by-lua可以使用一下,它类似于一个过滤器一样,如果配置了,nginx会在特定的阶段触发它,更具体的说nginx会在log阶段且在记录access log之前触发。所以我的大概思路是这样“如果请求后端服务器返回415那就输出请求头信息到日志中”,具体的脚本写出来就是这样(我当时想是不是可以用在服务的监控上):

location??~?\.do$?{

????????proxy_pass?http://$backend;
????????log_by_lua_block?{
??????????if?tonumber(ngx.var.status)?==?415?then
????????????????ngx.log(ngx.ERR,"upstream?reponse?status?is?415,please?notice?it,here?are?request?headers:")
????????????????local?h,?err?=?ngx.req.get_headers(100,true)
???????????????if?err?==?"truncated"?then
????????????????????ngx.log(ngx.ERR,"request?headers?beyond?100,will?not?return")
????????????????else
???????????????????local?cjson?=?require("cjson")
???????????????????ngx.log(ngx.ERR,cjson.encode(h))
??????????????end
??????????end
???????}
???}

和之前一样,继续开始守株待兔,运气不错,几分钟过后就出现了415,立马将请求头信息发给负责Resin的那个大哥,感觉马上要水落石出了,下楼抽根烟放松放松。

第三把斧亮相:

第二天刚到工位我就询问负责Resin那个大哥是否复现了问题,结果让人很意外,拿着我给的请求头信息居然没有复现问题,这太不科学了,大家在群里你一言我一嘴,感觉有些黔驴技穷,有人说要review Resin的源代码(线上出了问题,review我觉得真的是一种解决问题的下策),有人在那里抱怨说早应该把Resin替换掉的(事后诸葛亮),最后我提了一个土办法,应该可以复现问题,要是还不能复现真的就不科学了。兄台,tcpdump+wireshark了解一下,分几步来说:

1.在服务器上使用tcpdump抓一段时间的包,因为不确定什么时候会出现,所以暂定10分钟;

2.将第一步中产生的抓包文件使用wireshark打开,过滤http状态为415的请求,http.response.code==415;

3.选择其中一条报文,右键“追踪流-tcp流”;

4.复制第三步产生的tcp报文;

5.将第四步复制的tcp报文直接贴到jmeter里面进行测试(我为什么选择jmeter,因为可以直接模拟发送tcp报文,不会像postman增加一些自己的头);

6.成功复现结果;

7.导出jmeter脚本给负责Resin的同学修改bug;

问题原因分析:

最终确定是Resin出了问题,但这里有个前提是我们公司自己改造过的Resin,官方的Resin并没有这个问题,至于为什么我们改造过的Resin会出问题,这里就不多说了,只是一些内部的技术债罢了,说了可能也不会明白,明白了可能也不会碰上。

工具串讲:

首先我使用nginx的log_format直接输出请求头里面的content_type,但是如果想输出所有的请求头时这种方式就行不通了,所以我借助了lua-nginx-module中的log-by-lua在反向代理请求结束时输出了请求头,最后为了完完全全找到问题发生的场景,我使用tcpdump来抓取网络包,并且借助wireshark来找到发生了415的tcp报文,拿着tcp报文直接使用jmeter成功复现问题。

相关推荐

win7和win8系统哪个好用些(win7和win8.1哪个好用)

iqoo7用的是OriginOS系统。OriginOS系统给人的感觉还是相当耳目一新的。除了基本的设置、应用商店、i主题、闹钟、天气这些外,还多出了控制台、交互池、变形器、镜头包等。一加八出厂预装的...

电脑摄像头万能驱动(电脑摄像头驱动程序)

清理一下垃圾,点一下设置设置一下就可以了

qq下载官方下载(qq下载官网2020安卓版)

建议关闭杀毒软件,但是也不要轻易下载QQ群文件、陌生QQ邮件的附件以及陌生人发送的文件,很可能是病毒,如果提示有病毒,千万不要下载,避免电脑中毒。如果真的需要下载就暂时关闭杀毒软件。最终还是希望通过正...

台式电脑主机开不了机是什么原因
台式电脑主机开不了机是什么原因

重新接下VGA线,电源线,重新接插下,打开显示器开关。不行的话拨下显卡,清灰并检查显卡元件外观,电容鼓起的话,则显卡烧坏,换同型号电容即可。同样的内存也插拔下,擦拭下触点的位置换件检查,把主机输出接在电视上,检查,内存调换,显卡临时替换...

2025-11-07 15:51 off999

tp路由器无线桥接怎么设置(tp路由器如何桥接设置)

1、路由器接通电源,打开路由器并链接。2、弹出的界面中,设置管理员密码后跳过引导。3、在应用管理”中找到无线桥接”选项。4、点击开始设置”,找到要连接的无线网络,输入密码后点击下一步”。5、输入无线密...

笔记本电脑处理器怎么选(笔记本电脑处理器怎么选2020)

从科普与测试中可以看出笔记本CPU的各方面性能差异还是比较大的,可以总结为,在购买笔记本电脑时应优先选择最新一代中的更高端型号CPU,需求性能较高的用户可以选够标压且核心更多的CPU,需求高续航和低功...

格式化后文件还能恢复吗(格式化后文件怎么恢复)

可以恢复的,但是如果文件被覆盖了就不能恢复了。磁盘格式化后,建立了新的文件系统格式,原来硬盘上的数据会被抹去,不过数据不是真正的被清除,在新的数据存入之前即文件被覆盖之前是可以恢复的。现在很多软件都支...

win7无线网络共享设置方法(w7如何设置无线网络共享连接)

1.从右下角的网络连接标识或者是控制面板进入“网络和共享中心”,在左侧菜单里,选择“更改适配器配置”。2.找到已经连接的本地连接,然后右键菜单栏选择“属性”。3.在属性弹窗窗口中,找到“共享”选项卡,...

密钥是什么意思(电脑不含密钥是什么意思)

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为两种:对称密钥与非对称密钥。对称密钥加密,又称私钥加密或会话密钥加密算法,即信息的发送方和接收方用同一个密钥去加密和解...

visio下载安装教程(visio下载流程)
  • visio下载安装教程(visio下载流程)
  • visio下载安装教程(visio下载流程)
  • visio下载安装教程(visio下载流程)
  • visio下载安装教程(visio下载流程)
u盘启动bios设置方法(优盘启动bios设置方法)

1.通过按键进入BIOS设置,可以实现U盘启动。2.进入BIOS设置的原因是为了修改启动选项,让电脑从U盘启动。通常情况下,电脑默认会从硬盘启动,而我们需要通过修改BIOS设置来改变启动顺序。3....

黑客网站免费盗号(黑客盗号专用软件)

我不是黑客,当然也不会盗号,请你注意以下,不要加游戏里人的qq,不要登录有病毒网页,不要去看游戏里的网站,不要占小便宜。他们会盗号因为他们有盗号器。我跟您说:这个的确很简单,第一:不要用什么...

如何下载小马激活工具(如何下载小马激活工具软件)
  • 如何下载小马激活工具(如何下载小马激活工具软件)
  • 如何下载小马激活工具(如何下载小马激活工具软件)
  • 如何下载小马激活工具(如何下载小马激活工具软件)
  • 如何下载小马激活工具(如何下载小马激活工具软件)
win732位系统激活(win732位系统怎么激活)

按组合按钮“win+r”打开“运行对话框”,输入命令“slmgr.vbs-xpr”,点击确定。发现系统未激活状态。在“此电脑”鼠标右键,打开属性。在开始菜单上,点击鼠标右键,选择命令提示符{管理员}...

windows7光盘安装(win7 光盘安装)
  • windows7光盘安装(win7 光盘安装)
  • windows7光盘安装(win7 光盘安装)
  • windows7光盘安装(win7 光盘安装)
  • windows7光盘安装(win7 光盘安装)

取消回复欢迎 发表评论: