• OkHttp3错误异常: java.net.ProtocolException: unexpected end of stream竟是nginx惹的祸


    一、问题

    使用okhttp获取体检报告PDF时偶发报错;正常3次后就一直失败

    报错内容如下:
    在这里插入图片描述

    二、解决过程

    2.1 问题排查

    通过看源码确认是请求响应的长度和实际响应body的长度不一致导致的;
    网上有各种解决方案:

    1. 比如服务端添加响应头:“Transfer-Encoding”:“chunked” 忽略响应长度校验;
    2. 客户端通过okhttp的重试机制,失败后重试几次;

    这些解决方案全部失败告终;

    然后感觉是okhttp的问题,就通过postman测试了几次,postman请求不会报错;
    但有一个小现象:
    成功的响应时长:时长(3s) - 时短(625ms) 很不科学!

    在这里插入图片描述
    在这里插入图片描述

    后来通过观察猜测,postman也有重试机制;

    这时候我大概率猜到应该是服务端的问题;

    站不住脚的猜测依据:

    okhttp正常3次之后就报错
    postman也有请求失败的重试机制
    说明这个问题不单单是okhttp3自身导致的

    为了再次验证和解决,我用Apache-Httpclient请求,现象依旧是正常几次之后,就开始报错;报错内容:
    在这里插入图片描述

    ApacheHttpClient的报错和okhttp的报错含义是类似的;依旧是响应长度不对导致的;
    但是ApacheHttpClient在网上此问题的回答很多;

    2.2 定位到nginx

    搜索关键词
    Truncated chunk (expected size: 81,920; actual size: 61,583)

    看到了第一篇文章:
    https://blog.csdn.net/weixin_30478757/article/details/98417848
    答案:

    终于定位到是nginx的问题,因为nginx处理chunked传输有问题。
    所以最简单的处理方式是把nginx的缓存关闭。

    这时候我就锁定了解决问题的方向——> nginx

    立马查看Nginx的日志,果然在报错:
    在这里插入图片描述

    搜索关键词:
    usr/local/nginx/proxy_temp

    相关回答:
    https://blog.csdn.net/wxb880114/article/details/116654001

    答案:
    在这里插入图片描述

    根据答案修改nginx.conf的配置;

    然后再次测试,问题解决!

    三 问题总结

    nginx配置:

    • proxy_temp_file_write_size 24k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
      而获取的体检报告基本都在100k以上;

    问题就出在proxy_temp_file_write_size上,当nginx服务器传输的文件超过参数设置的大小时,Nginx会先将文件写入临时目录(缺省时默认为Nginx安装目下/proxy_temp目录),缺省Nginx是以nobody身份启动的,用ls -al 命令查看proxy_temp目录 nobody是proxy_temp目录的所有者,怪了那为什么没权限呢?查看proxy_temp的父目录既Nginx安装目录。发现nobody竞然没权限

    解决方案有多种,大家根据自己需求变通使用:

    • 设置proxy_temp目录的权限,然后重启nginx;
    • 修改nginx配置的用户权限,不推荐使用root用户,root权限过大,存在风险;
    • 增大proxy_temp_file_write_size的值,不让临时文件写入proxy_temp目录即可,记得重启nginx;
  • 相关阅读:
    WebGPU学习(9)---使用Pipeline Overridable Constants
    EasyRecovery适用于Windows和Mac的专业硬盘恢复软件
    快速排序(Quick Sort)
    溢出、截断、类型提升:从易错代码入手分析整型数据存储与类型转换
    DB-GPT发布:用私有LLM技术彻底改革数据库互动
    【函数式编程实战】(八) 如何将你的代码重构
    css表单单选框、复选框、上传文字和隐藏字段、下拉菜单、文本域、字段集
    大周建议自媒体博主前期做这4件事
    使用华为eNSP组网试验⑴-通过Vlan进行网络设备间通讯
    《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站
  • 原文地址:https://blog.csdn.net/qq_34908167/article/details/125562029