文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程
场景前端上传的视频文件过大做了一个分片上传的接口 调试接口的时候后端EasySwoole程序接收不到请求前端发现接口返回状态码408遇到的问题一个文件分三片上传第一次请求接口正常后面第二次请求就被nginx拦截返回状态码400紧接着请求又返回408前端是App不好调试只能从nginx和网络抓包分析问题问题排查过程:php程序接口日志无输出直接打开Nginx的access .log看日志第一次请求成功状态码是200。第二次就请求失败了状态码是400然后前端进行两次重传也是失败了返回状态码还变成了408因为前端是App调用的接口看不到详细请求只能在服务器抓包用Wireshark分析前端的请求发现请求成功的是一个完整的http请求是流0红色的标识客户端App发送的入参每一个参数末尾有分隔符boundary追踪这个流到流1就是失败的请求因为文件参数结尾没有boundary服务器读取不了入参 直接被nginx拦截了返回400 也就没有响应数据。前端进行重传的流2和流3nginx还是接收不到完整的参数就返回了408Nginx文档描述在设置的超时时间参数client_header_timeout和client_body_timeout的时间内服务端没有读取到正常的请求头和请求体就会返回408但是这个问题说明了服务端在接收两次请求都没有读取到对应的请求体nginx也会返回408跟时间无关修改时间参数解决不了问题最后由前端手动加上了入参的boundary就能正常上传