proxy_request_buffering on; client_max_body_size 50m; client_body_buffer_size 1m; client_body_temp_path /var/cache/nginx/client_temp;
前端上传 30MB 文件,进度到 60% 时后端报 Unexpected end of JSON input,Nginx 的 499 同时增加。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,关掉 request buffering 后 Nginx 边收边转,客户端一断或超时,上游收到的是不完整 body。client_body_buffer_size 太小还会频繁落临时文件。
「请求体截断」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:上传接口改回 proxy_request_buffering on 让 Nginx 收完再转;client_max_body_size 和 client_body_temp_path 的磁盘留够空间;client_body_buffer_size 按常见文件大小调 减少落盘;后端按 Content-Length 校验长度 不完整直接拒绝。
改完只确认一件事:同样的 30MB 上传一次成功 后端拿到的 JSON 能正常解析 499 不再出现。
