写点什么

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:345586
用户头像

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

关注

评论

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

什么是 Kubeless?| 玩转 Kubeless

donghui

Kubernetes kubeless

Java 客户端操作 FastDFS 实现文件上传下载替换删除

哈喽沃德先生

Java 文件系统 分布式文件存储 fastdfs 文件服务器

高难度对话读书笔记——目的篇

wo是一棵草

第3周学习总结

饭桶

从戚家军看组织战斗力塑造(组织的六脉神剑)

凌晞

组织

“三段三域法”应用架构模型

凌晞

架构 架构设计 技术架构

我就不服了,看完这篇文章,5大常见消息队列开发你还学不会

小Q

Java 编程 程序员 开发 消息队列

第3周作业提交

饭桶

架构方法论之“极限审视法”

凌晞

架构 方法论 设计思维

轻言业务架构图

凌晞

架构 企业架构 架构设计 架构设计原则 业务架构

手把手教你锤面试官 04——假装精通redis

慵懒的土拨鼠

深圳派发数字人民币红包!个人数字人民币钱包即将亮相

CECBC

数字货币 数字人民币

2020第十三届南京国际智慧停车展览会

InfoQ_caf7dbb9aa8a

2020第十三届南京国际智慧工地装备展览会

InfoQ_caf7dbb9aa8a

2020南京国际人工智能产品展览会

InfoQ_caf7dbb9aa8a

人工智能

2020第十三届南京国际大数据产业博览会

InfoQ_caf7dbb9aa8a

创新者谈

善宝橘

创新

技术解码 | 玩转视频播放,自适应码流技术

腾讯云音视频

音视频 转码

Redis-技术专题-数据结构

码界西柚

SpringBoot 实战:如何优雅的处理异常

看山

springboot 实战 优雅响应

架构师训练营第一期 - 第四周课后 - 作业二

极客大学架构师训练营

MySQL-技术专题-实战技巧

码界西柚

MySQL-技术专题-Join语法以及性能优化

码界西柚

转型敏捷123

研发管理Jojo

2020南京国际工业互联网及工业通讯展览会

InfoQ_caf7dbb9aa8a

技术革新的脉络及趋势

凌晞

技术 进步

MySQL-技术专题-SQL性能分析

码界西柚

晨间日记的奇迹

熊斌

读书笔记

PanDownload复活了!60MB/s!附下载地址

程序员生活志

PanDownload 网盘 下载器

SpringBoot-技术专题-@Async异步注解

码界西柚

万万没想到!ModelArts与AppCube组CP了

华为云开发者联盟

AI 技术 华为云

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