写点什么

NGINX 应用性能优化指南(第二部分):反向代理缓冲

  • 2016-04-20
  • 本文字数:1287 字

    阅读完需:约 4 分钟

【编者的话】本文是“NGINX 应用性能优化指南”系列文章的第二篇,主要介绍了如何通过反向代理缓冲实现 NGINX 应用性能优化。

注:本文最初发布于 MaxCDN 博客,InfoQ 中文站在获得作者授权的基础上对文章进行了翻译。

正文

当 NGINX 从后台接收响应时,代理缓冲非常有用。这既可以发生在第一次获取可缓冲的资源时,也可以发生在请求动态 / 不可缓冲内容时。

按照设计,NGINX 会为大小合理的响应正文设置缓冲区。但是,如果来自后台应用服务器的响应无法放入这些缓冲区,响应就会被写进一个临时文件。

对于可缓存内容,这不算什么问题,因为你可以恰当地配置缓存,让它基于反向代理的文件系统。然而为了正确设置代理缓冲区的大小,你会想分析应用的不可缓存响应,而对于块编码的响应,你会想分析块与块之间的差别。

指令proxy_buffering决定 NGINX 是异步(默认启用)还是同步(禁用)转发响应。

proxy_buffering禁用时,从服务器收到的数据会被 NGINX 立即转发,这样可以获得最小的首字节时间(TTFB)。

从响应中读取的数据量受 proxy_buffer_size控制——代理缓冲禁用时唯一相关的代理缓冲指令。因此,如果你的目标是 TTFB,那么请确保tcp_nodelay被启用(默认),而tcp_nopush被禁用(默认)。

警告:禁用代理缓冲实际上风险相当大,因此,除非你知道自己究竟在做什么,否则我不建议你那么做。通常,反向代理和后台应用服务器位于同一个速度非常快的局域网上。但是客户端连接质量差异巨大,有时还会失速。

如果代理的客户端连接对代理的上游连接(大资源或 HTTP/2)造成反压,它就劫持了应用服务器,迫使它以客户端的低速度传送完响应末尾部分。有些人喜欢部署许多性能较差的后台服务器,而这些服务器无法支撑几百个以上的并发连接,对他们而言,这个问题尤为严重。

另一方面,proxy_buffering启用时,要提防使用的代理缓冲区太大。这可能会吃掉你的内存,限制代理能够支持的最大并发连接数。

虽然可能大多数人会配置全局代理缓冲和缓冲区大小,但值得注意的是,这套指令可以针对每个服务器块甚至是每个位置块进行配置,为自定义内容分发提供无限的灵活性。

相关教程: NGINX 代理指令清单

对于 HTML 或 JavaScript,HTTP Archive 的统计表明,单个响应的平均大小小于32KB ,因此,你可能不需要调整 proxy_buffers的默认值。

在进行无知的猜测前,先看下应用程序响应正文的大小,并设法限制代理缓冲区随动态响应增长,因为那些响应不会被缓存。而且,可缓存响应无论如何都需要存入磁盘,因此设法将它们全部缓冲可能没什么用。

NGINX 还能够让应用程序服务器使用 HTTP 响应头字段X-Accel-Buffering(设置为yesno)根据每个响应决定代理缓冲区行为。不过,它不允许应用服务器影响那个响应的缓冲区大小,因此会使用 _ 内在的 _ 配置值。或者,就像忽略其他任何带有proxy_ignore_headers指令的 HTTP 头一样忽略它。

查看引文原文: NGINX Application Performance Optimization:Reverse Proxy Buffering


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-20 17:345127
用户头像

发布了 1008 篇内容, 共 389.3 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

学习前端技术选择培训还是自学比较好?

小谷哥

「技术直播」分布式数据库订阅功能的原理及实现

TDengine

数据库 tdengine 时序数据库

浅析华为云基于HBase MTTR上的优化实践

华为云开发者联盟

大数据 后端 华为云 企业号 1 月 PK 榜

可观测性之Log4j2优雅日志打印原创

宋小生

日志 可观测性 log4j2

【架构设计】如何让你的应用做到高内聚、低耦合?

JAVA旭阳

Java 架构

乐视每周工作四天半?我们也可以

不想敲代码

程序员 效率工具 协同办公

web前端开发培训怎么入门

小谷哥

DM 数据旅程 02:分库分表悲观协调——03reSync

TiDB 社区干货传送门

迁移

案例故事丨老虎国际 x TiDB ,降低架构复杂性,保障全球用户安全可靠投资

TiDB 社区干货传送门

数据库发展史

TiDB 社区干货传送门

数据库前沿趋势

TiDB 事务与锁整理

TiDB 社区干货传送门

TiDB 底层架构 TiKV 底层架构

DM 数据旅程 01:序言 + 第一次 start task

TiDB 社区干货传送门

迁移

TiDB 6.5 LTS 发版

TiDB 社区干货传送门

新版本/特性发布

关于 TiDB 对接数据仓库的一些思考

TiDB 社区干货传送门

实践案例 新版本/特性解读 数据库架构设计 6.x 实践

DM 数据旅程 02:分库分表悲观协调——02Lock -> Resolve Lock

TiDB 社区干货传送门

迁移

版本控制 | 一文了解虚拟制作,进入影视制作新赛道

龙智—DevSecOps解决方案

版本控制 版本控制软件 虚拟制作

学习java技术哪些方法比较靠谱

小谷哥

培训大数据技术怎么学

小谷哥

大数据开发培训怎么来选择?

小谷哥

cookie、session,、token,还在傻傻分不清

华为云开发者联盟

前端 华为云 企业号 1 月 PK 榜

DM 数据旅程 02:分库分表悲观协调——01准备过程

TiDB 社区干货传送门

迁移

复制 order 表的效率挑战

TiDB 社区干货传送门

新版本/特性发布 性能测评

发布文章指引手册

TiDB 社区干货传送门

社区活动

缓存与数据库双写时的数据如何保证一致性?

风铃架构日知录

Java 程序员 后端 开发工程师 后端开发工程师

软件测试/测试开发丨你以为Shell只是命令行?读懂这篇文,给你的工作赋能

测试人

Shell 软件测试 命令行 自动化测试 测试开发

CodeArts TestPlan:一站式测试管理平台

华为云开发者联盟

云计算 后端 华为云 企业号 1 月 PK 榜

阿里云办公安全产品专家高传贵:零信任,让全球办公安全更简单

云布道师

阿里云

如何构建企业内的 TiDB 自运维体系 | 得物技术

TiDB 社区干货传送门

LiveMe x TiDB丨单表数据量 39 亿条,简化架构新体验

TiDB 社区干货传送门

灵雀云入选2022 EDGE AWARDS「创新场景50」年度最佳场景实践榜单

York

云原生 数字化转型 业务思维 科技创新

ITSM | 权威指南发布,高速IT服务管理团队是什么样子的?

龙智—DevSecOps解决方案

数字化 ITSM IT服务管理中心

NGINX应用性能优化指南(第二部分):反向代理缓冲_后端_谢丽_InfoQ精选文章