热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NginxBuffer机制引发的下载故障

Nginx

前几天,接到研发同事反馈,内网通过 Nginx 代理下载 OSS 的大文件时,老是会断,而在服务器上下载时却很正常,非常奇怪。原本以为可能和 VPN 有关,经确认排除嫌疑。彷徨了许久,最后发现是 Nginx Buffer 的锅。下面就来聊聊这个问题是怎么发生的。

Nginx Buffer 机制

在 Nginx 代理过程中,有两种连接:

1.客户端到 Nginx 的连接2.Nginx 到后端服务器的连接

这两个连接的速度不一致,会对客户端的体验带来不良的影响。Nginx 正是通过 Buffer 机制来缓解这个问题。

当启用 buffer 时,Nginx 将会临时存储后端响应内容在内存或者磁盘上,然后慢慢把数据推送给客户端;若关闭,则会按照响应内容的多少立刻同步到客户端。

假设客户端的速度足够快,那么完全可以把 buffer 关掉,让数据尽可能快速到达;如果客户端很慢,就应该保持 buffer 开启,这样有利于 Nginx 和后端的连接复用(本质上是 HTTP 队头阻塞问题)。

大文件下载问题

Nginx Buffer 机制默认处于开启状态,其会根据 proxy_buffer_size
 和 proxy_buffers
 这两个参数控制写入内存的大小。如果响应大于这个 buffer 大小,Nginx 会继续通过 proxy_max_temp_file_size
 参数将响应其余部分写入到磁盘临时文件。

那么问题来了,如果响应还是很大,超过了临时文件的限额怎么办?

等! 此时,Nginx 的 socket 缓冲区也是出于满载状态。由于客户端很慢,Nginx 并没有触发 read
 后端操作。这里大概率会触发后端服务器的 write
 超时,进而由后端发起 close
 操作。

这就是我遇到的问题:proxy_max_temp_file_size
 默认为 1G,当客户端的网络比较慢时,临时文件很快就被写满。这时候后端的响应还会继续被接收到 socket 缓冲区,直到缓冲区被打满。此时,Nginx 所在服务器通过滑动窗口 zero 0 告知后端服务器停止发送数据,直至触发了后端的 write
 超时。

而当客户端的网络比较快时,临时文件并不会被写满,或者即使写满了也很快就会消费掉,不至于让后端“阻塞”过长时间触发超时。

如何解决?

1.调整 proxy_max_temp_file_size
 大小调大    让临时文件足够可以缓冲整个响应调小    让整个链路上的数据流动起来,不要阻塞后端的 write
 操作,进而触发后端的超时
2.关闭 Buffer     不推荐,会影响 Nginx 到后端的连接复用

参考文章

Module ngx_http_proxy_module[1]Nginx —— 理解HTTP 代理,负载均衡,缓冲(Buffering)和缓存(Caching)[2]

引用链接

[1]
 Module ngx_http_proxy_module: http://nginx.org/en/docs/http/ngx_http_proxy_module.html
[2]
 Nginx —— 理解HTTP 代理,负载均衡,缓冲(Buffering)和缓存(Caching): https://n3xtchen.github.io/n3xtchen/nginx/2016/02/19/nginx-port-forwording




推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • oracle 数据库正常关闭情况下当前日志损坏的恢复(转) ... [详细]
author-avatar
龙蛇虫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有