记录前端排查net::err_empty_response的过程
问题描述:
项目框架:vue+elementui
部署环境:k8s nginx
项目部署到测试环境,登录到首页,或者刷新首页(刷新6、7次必现)会偶现如下几个错误,但是生产环境和本地没有问题,且https访问没问题,但是http访问会有问题。出现问题之后会导致页面空白。
Err_empty_response、ERR_CONTENT_LENGTH_MISMATCH、ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
排查过程:
一、排除登陆验证跳转引起的问题
根据错误信息(Err_empty_reponse ERR_CONTENT_LENGTH_MISMATCH)百度得到的结论都是请求还未返回就被中断了,或者是请求还未被完全接收(可能只接收的一半)请求就被中断了,考虑到请求被中断,第一想到的是,因为这个项目是单点登陆,所以在刷新页面的时候,会去判断是否已登陆,刷新的时候store的isLogin的状态会丢失,所以会去请求是否登陆,浏览器的url会跳转,验证完成之后会在跳转到当前页面,想着是否跳转引起的js还未加载完成就刷新的页面,所以就去把跳转的代码注释了,写死登陆信息,在测试环境验证还是有问题,就排除了这个问题。
二、排除包太大引起的
因为我这边出现的一直是打包后的app.js报错,所以想着是否是因为打包的js文件过大引起的,所以就更改的vue.config.js文件,分包让js变小一点,但是部署后测试依然发现还是有这个问题
三、排除http访问时但是转发了https的请求
因为https并没有问题,百度有说代码里面有https的请求,说在http中访问了https的请求导致的,把代码中的https的请求全部换成http,部署测试依然不行
四、排除nginx的缓存大小和缓存临时目录没有权限
根据net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)这个错误提示,百度搜索说是nginx的缓存太小或者是nginx的临时目录过大或没有权限写入缓存文件,但是我调整(改缓存大小,给权限、禁用缓存)之后,在部署依然还是有这个问题,同时测试了关闭proxy缓存依然有问题
参考:https://www.cnblogs.com/youcong/p/13828579.html
五、排除nginx配置问题
考虑到相同的部署环境,其他的项目都可以,为什么就这个项目不行,想着会不会配置不一样导致,所以去比对了其他的项目和本项目nginx和k8s的配置,把不同的地方都改成了一样,部署之后测试发现依然不行。
六、注释首页的请求(已经差不多快要定位到问题了)
测试发现这个项目的首页刷新要发送37个请求,而其他的项目只有20多个,想着是不是因为请求太多了造成的,是不是服务做了限流?于是就把这个页面的所有初始化要请求的api全部注释了(只是为了减少请求数量,初始化时会调用好几个接口初始化数据),再部署测试发现竟然可以了(纯属瞎猫碰上死耗子),然后再一点点的打开api请求,验证问题,发现这个页面的查询api(created钩子函数中调用查询接口)只要调用了项目就有问题,想着这个api是再created生命周期函数中,想着是不是太早了,改到mounted之后依然不可以,想着可能是和这个查询方法有关系,就一点点的注释代码验证确实具体是哪行代码引起,发现就是调用这个api有问题。
七、排除重复刷新引起问题
上面发现mounted调用这个接口有问题,就想打印日志看一下,有没有错误信息,后来发现这个mounted页面竟然调用了两遍,就想着会不会和这个有关系,然后调整了代码,mounted只调用一遍(初始化有些参数变更会自动刷新页面导致两次调用),测试发现依然不可以。
八、postman验证api
想着是不是就是api本身有问题(因为api有时候是可以调通的,所以之前没有想过是api的问题),单独把这个api拿出来放到postman验证,发现缺有问题,概率性的掉不通,但大部分情况可以通,并且其他的api并没有这个问题,所以想着应该不是api的问题,会不会是这个api请求不通的时候,是因为请求根本没有到达nginx就中断,于是就去k8s上各种查找错误,但是nginx服务并没有错误信息,nginx的error.log和access.log 都没有错误信息。使用tcpdump抓包发现调用api如果有问题,就抓不到包。
九、与后端api同事联调
因为在服务器上一直找不到原因,所以想着会不会是防火墙什么的对这个api做了特定的设置限流了,于是让后端的同事重新写了一个接口(就是换个名字),测试发现还是不行。想着是不是返回结果有敏感信息导致的,就让后端的同时把api的结果写死,不返回数据。结果测试发现竟然可以了。说明就是api的原因,然后后端同事一点点的注释代码测试发现是这个api又调用的其他服务的api,只有把这个调用注释之后就没问题。
十、继续排查api的问题
虽然定位到是后端api的问题了,但是为什么这个api有时候可以有时候不可以,后端的同事还在排查,排查清楚之后我再更新。。。。。