今天新上线一个项目的时候用到了一个上传的接口,在本地测试和内网环境下都正常,上服务器以后一直504,应用log显示文件没有被上传上来,而浏览器log却显示文件正常上传。
初步推断是tengine上没把请求转发完全,导致后端一直在等待剩下的body,直到90s超时。
于是在服务器上架起了ssh隧道,通过本地直传服务器,就能够正常上传,于是将问题确定在了反代的tengine上
最初以"nginx proxy_pass post 504"为关键字,在Google上搜索,有说设置proxy_http_version 1.1
并且加proxy_set_header Connection "keep-alive";
就正常了的,上调各种timeout也肯定不是我这里的问题,毕竟文件只有几十KB。
没辙了,抓包吧,不抓不知道,一抓吓一跳
boundary居然丢了,正常情况下的multipart/form-data应该至少有一对boundary,就像浏览器中显示的
两个boundary夹着文件一起上传,而boundary的丢失导致请求实际长度和content-length对不上,所以后端一直在等待tengine把省下的请求发送过去,那么继续Google
结果翻到了这个issue
https://github.com/alibaba/tengine/issues/1003
最后回复两天前
正好前阵子tengine刚升级到2.2.2,我在厂里也起了http2,所以用最新的tengine重新编译了,结果正好撞上了这次的bug
目前的临时解决方案是proxy_request_buffering off;
,禁用代理缓冲