问题描述
测试人员反馈测试服务器文件下载接口不可用,请求接收不到响应。
这里先简单描述一下服务架构,对后续的问题排查有用。
内部服务部署在内网,提供对外的访问链接要求在公网,所以开放了服务器的一个端口到公网,外部请求通过开放的公网端口到达 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
重新访问服务,文件正常下载,问题解决。