Nginx:upstream sent invalid chunked response while reading upstream

问题描述

测试人员反馈测试服务器文件下载接口不可用,请求接收不到响应。

这里先简单描述一下服务架构,对后续的问题排查有用。

内部服务部署在内网,提供对外的访问链接要求在公网,所以开放了服务器的一个端口到公网,外部请求通过开放的公网端口到达 Nginx 服务器,由 Nginx 服务器对外部请求进行代理转发。

问题排查

1、根据服务架构,首先直接通过内部IP端口访问内部服务,看服务是否正常。
2、内部IP端口访问服务正常,查看服务日志,看请求是否有正确代理到内部服务。
3、服务正常到达,但是响应异常org.apache.catalina.connector.ClientAbortException: java.io.IOException: 远程主机强迫关闭了一个现有的连接
4、猜测问题出在 Nginx 代理,查看 Nginx 的 access.log 和 error.log 日志文件。
5、找到对应请求路径,在 error.log 文件中定位到异常原因 upstream sent invalid chunked response while reading upstream

问题解决

upstream sent invalid chunked response while reading upstream 异常产生的原因是由于Http 协议版本不一致。

查看Nginx 的 access.log ,请求的协议为 HTTP/1.1 ,而Nginx代理的协议默认是 HTTP/1.0 ,不支持分块传输,所以导致 Nginx 抛弃了请求的响应,服务端发生IO异常,客户端丢失响应。

在代理的 server 或 location 模块里添加如下配置

# 设置代理协议为 HTTP/1.1 
proxy_http_version 1.1;
# 设置Connection 为空串,禁止传递头部到服务端
proxy_set_header Connection "";

重启 Nginx 服务。

nginx -s reload

重新访问服务,文件正常下载,问题解决。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容