2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

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

关注

评论

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

极狐 GitLab 初探(上)

极狐GitLab

ci DevOps gitlab CD 敏捷开发管理

通证经济最核心的价值,就是带来了流动性的质变

CECBC

区块链的风险与防范

CECBC

初学汇编

若尘

汇编 汇编语言 7月日更

智汇华云 | kata container virtiofs测试和技术分析

华云数据

呱呱乐园软件开发|呱呱乐园系统APP开发

AQS介绍和原理分析(下)-条件中断

追风少年

Java 并发编程 AQS

自学编程找工作!46道面试题带你了解中高级Android面试

欢喜学安卓

android 程序员 面试 移动开发

架构之路,道阻且长

長庚

门道APP开发|门道软件系统开发

对标阿里水准!2021年最全Java架构面试点+技术点标准手册

Java架构追梦

Java 学习 阿里巴巴 架构 面试

存储大师班 | Linux IO 模式之 io_uring

QingStor分布式存储

Linux 文件存储 分布式存储 Linux Kenel

数字人民币热度不断攀升 多地再迎大规模试点

CECBC

自学者福利!BAT常见的20道Android面试题详解

欢喜学安卓

android 程序员 面试 移动开发

mysql常用命令

阿呆

mysql命令

思购臻选系统开发|思购臻选APP软件开发

数据驱动决策,可视化推动传统电力发展革命史?

一只数据鲸鱼

数据可视化 智慧能源 水力发电 智慧水利

揭秘百度微服务监控:百度游戏服务监控的演进

百度Geek说

微服务 大前端 游戏

(ROYOLE)全球首款柔性屏开发套件,柔宇RoKit终于来了!

Vsir·横磨剑

什么是 shell?

学神来啦

云计算 运维 Shell shell脚本编写

乐活星际系统软件开发资料

项目绩效考核管理有哪些方法?这7种考核方式值得一试!

优秀

低代码

知识大陆软件系统开发介绍

工卡融合柔性屏,办公效率和信息安全性可能会有质的飞跃?

船医特拉法尔加

JVM面试高频考点:由浅入深带你了解G1垃圾回收器!

华为云开发者联盟

Java JVM 服务端 G1垃圾回收器 Java堆

Serverless 时代下大规模微服务应用运维的最佳实践

阿里巴巴中间件

云计算 Serverless 微服务 云原生 中间件

万万没想到,低功耗也会烧毁元器件?

不脱发的程序猿

嵌入式 电路设计 低功耗 ADI 稳压器

中国移动5G消息开发者社区强势助力,创客马拉松大赛5G消息专题赛重磅来袭!

5G消息

开发者 开发者社区 应用开发 开发者大赛 5G消息

桌面多空间使用技巧

吴脑的键客

chrome Windows 10 fedora

Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

程序员小航

Java redis 源码 redssion redisson 分布式锁

赞 1 收藏 分享 B站崩溃3小时引网友狂欢:A站成为最大赢家?

白亦杨

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