文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程

场景:前端上传的视频文件过大,做了一个分片上传的接口, 调试接口的时候,后端EasySwoole 程序接收不到请求,前端发现接口返回状态码408

遇到的问题:一个文件分三片上传,第一次请求接口正常,后面第二次请求就被nginx拦截,返回状态码400,紧接着请求又返回408,前端是App不好调试,只能从nginx和网络抓包分析问题

问题排查过程:

php程序接口日志无输出,直接打开Nginxaccess .log****,看日志:****

第一次请求成功,状态码是200。

第二次就请求失败了,状态码是400,

然后前端进行两次重传也是失败了,返回状态码还变成了408

因为前端是App调用的接口,看不到详细请求,只能在服务器抓包,Wireshark********分析前端的请求发现:

请求成功的是一个完整的http 请求,是流0,红色的标识客户端(App)发送的入参,每一个参数末尾有分隔符boundary

追踪这个流到流1,就是失败的请求,因为文件参数结尾没有boundary,服务器读取不了入参, 直接被 nginx 拦截了返回400, 也就没有响应数据。

前端进行重传的流2 和流3,nginx 还是接收不到完整的参数就返回了408

Nginx********文档描述:

在设置的超时时间参数client_header_timeout 和client_body_timeout 的时间内,服务端没有读取到正常的请求头和请求体,就会返回408,但是这个问题说明了服务端在接收两次请求都没有读取到对应的请求体,nginx 也会返回408,跟时间无关,修改时间参数解决不了问题

最后由前端手动加上了入参的boundary,就能正常上传:

相关推荐
荣--14 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森15 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
ping某5 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务