1. 问题背景与现象描述
最近在生产环境遇到一个棘手的文件下载问题:版本发布后,系统附件下载功能出现异常。经过初步观察发现一个非常明显的规律——当文件大小小于1KB时下载功能完全正常,但只要文件大小达到或超过1KB,下载就会失败。
查看Nginx错误日志时,发现了关键报错信息:
code复制2026/03/16 11:38:16 [error] 11#0: *465 upstream sent invalid chunked response while reading upstream, client: x.x.x.x, server: localhost, request: "GET /x/x/mediaFile/download?mediaType=img&mediaId=x HTTP/1.1", upstream: "http://x.x.x.x:x/mediaFile/download?mediaType=img&mediaId=x", host: "x", referrer: "x"
这个报错直指问题核心——上游服务返回了无效的分块传输编码(chunked)响应。作为有经验的运维人员,我立即意识到这很可能与HTTP协议中的传输编码机制有关。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与问题定位
2.1 系统组网结构
我们的系统架构如下:
code复制客户端 → Nginx → 服务A → ALB(应用负载均衡) → 服务B
其中服务A是一个Java服务,使用Tomcat作为应用服务器;服务B是实际提供文件下载的后端服务;ALB基于Nginx实现。
2.2 初步排查过程
首先在测试环境复现问题,并在服务A中打印服务B返回的响应头。发现了以下关键现象:
- 当下载文件小于1KB时,响应头中不包含"Transfer-Encoding":"chunked"
- 当下载文件≥1KB时,响应头中出现了"Transfer-Encoding":"chunked"
检查服务A的问题代码片段:
java复制public void download(... HttpServletResponse servletResponse) {
// 调用B服务获取文件流
Response response = PostManUtil.
