热门标签 | 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




推荐阅读
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了 MySQL InnoDB 存储引擎的事务机制,包括 ACID 特性、redo 日志、undo 日志以及 checkpoint 的作用和实现方式。 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
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社区 版权所有