当前位置: 首页 > news >正文

15 nginx 中默认的 proxy_buffering 导致基于 http 的流式响应存在 buffer, 以 4kb 一批次返回

前言

这也是最近碰到的一个问题 

直连 流式 http 服务, 发现 流式响应正常, 0.1 秒接收到一个响应 

但是 经过 nginx 代理一层之后, 就发现了 类似于缓冲的效果, 1秒接收到 10个响应 

最终 调试 发现是 nginx 的 proxy_buffering 配置引起的 

然后 更新 proxy_buffering 为 off 解决了这个问题 

这里 主要是 来调试一下 这个 proxy_buffering 的影响 

 

 

测试用例

可以参见 http 协议中如何实现流式的交互数据

这里为了方便问题复现, 做了一些 小调整, 增加了 响应的数据量, 减少了 sleep 

 

客户端这边如下, 直接访问服务 8080, 可以看到 0.01 秒 1 个响应

 

切换成基于 nginx 访问服务, 现象是 2秒一堆响应 

 

 

nginx 配置如下, 将 proxy_buffering 设置为 off, 则基于原服务, nginx 效果一致 了 

 

 

proxy_buffering 为 false 的调用链路 

这个看着比较直观, 每一次 upstream 响应数据了, nginx接收到了数据, 然后直接 响应给下游服务 

这里 out->buf 为 响应头

out->next->buf 为 chunked_body_filter 封装的一个响应, 我们这里不用关心 

out->next->next->buf 为 nginx 接收到 upstream 的一次响应 

 

第二次断点, 因为第一个断点有停留, 服务器在不断地响应数据, 所以 nginx 这边拿到了 服务器的N次响应, 这里 一起响应给客户端 

 

 

proxy_buffering 为 true 的调用链路 

可以看到 第一次响应给下游服务, nginx 就拿到了 N 个响应 

然后 这里的 buffer 主要是基于 ngx_event_pipe_write_to_downstream 中的管道的策略进行控制的, 存在一定的 buffer, buffer 满了之后, 一次性刷新数据到 下游服务 

 

判断刷新的地方 是在这里 

 

 

然后这个阈值 可以通过 proxy_busy_buffers_size 进行配置 

 

nginx 中调试如下 

 

 

 

 

完 

 

 

 

 

 

相关文章:

  • 编程常见错误归类
  • 第五届能源工程、新能源材料与器件国际学术会议(NEMD 2025)
  • 使用VHD虚拟磁盘安装双系统,避免磁盘分区
  • 每天学一个 Linux 命令(23):file
  • 电能质量治理解决方案:构建高效、安全的电力系统
  • 前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
  • 《软件设计师》复习笔记(11.2)——开发方法、产品线、软件复用、逆向
  • docker部署springboot(eureka server)项目
  • 网安加·百家讲坛 | 刘志诚:AI安全风险与未来展望
  • 8.观察者模式:思考与解读
  • 3D机器视觉激光器在智能制造领域的主要应用
  • 【LeetCode】大厂面试算法真题回忆(61)--组装新的数组
  • 电子电器架构 --- OEM企标中规定ECU启动时间的目的
  • 基于C++(MFC)的细胞识别程序
  • 焊接机器人的设计
  • CVE-2023-46604漏洞复现与深度分析
  • jQuery — DOM与CSS操作
  • 【MySQL】MySQL表的增删改查(CRUD) —— 上篇
  • 轻松实现文字转语音 - Coqui TTS部署实践
  • 鸿蒙NEXT开发键值型数据工具类(ArkTs)
  • 特朗普关税风暴中的“稳”与“变”:新加坡国会选举观察
  • “五一”假期余额不足两天,多地景点已约满、限流
  • 美国得克萨斯州发生5.4级地震,震源深度10千米
  • 申活观察|精致精准精细,城市“双面镜”照见怎样的海派活力
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 澳大利亚总理阿尔巴尼斯率领工党赢得2025年联邦选举