写点什么

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

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

关注

评论

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

Apache ShardingSphere 代码格式化实战 —— Spotless

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

多方系统集成的启示

QualityFocus

集成测试 系统集成

linux之软连接和硬连接的区别

入门小站

Linux

我们在讲的 Database Plus,到底能解决什么样的问题?

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

2022语言与智能技术竞赛再升级,推出NLP四大前沿任务

百度大脑

重学架构之电商秒杀系统

陈华英

架构实战营

清华校友走进百度 用科技赋能产业智能化转型

百度大脑

赛事解析|乒乓球时序动作定位大赛亚军方案分享

百度大脑

一站式内容创作助手 智能创作平台生成正式商用

百度大脑

Java 如何从一个 List 中随机获得元素

HoneyMoose

DaaS服务之分布式日志/缓存/对象存储

穿过生命散发芬芳

4月月更

制造蝴蝶飓风,微众区块链的蝶变和ESG新使命

脑极体

资源画像,让容器资源规格的填写不再纠结

阿里巴巴云原生

阿里云 容器 云原生

[Day28]-[二叉树]左叶子之和

方勇(gopher)

LeetCode 数据结构与算法

RTC 科普视频丨聊聊空间音频的原理与其背后的声学原理

声网

RTE技术详解 空间音频

R 编程语言 - 简介

海拥(haiyong.site)

R语言 4月月更

百度天工AIoT打造农业种植方案,用数字经济助力建设农业新模式

百度大脑

你竟不劝我坚持

QualityFocus

职业规划 职业生涯规划

浮点数-Float-Double转二进制

入门小站

工具

参加 KubeVela 开源之夏,给你的云计算编程能力加个 Buff

阿里巴巴云原生

阿里云 云原生 开源之夏

linux之软连接和硬连接的区别

入门小站

Linux

CorelDRAW Graphics Suite2022中文版

茶色酒

cdr2022

[Day29]-[数组]将一维数组转变成二维数组

方勇(gopher)

LeetCode 数据结构算法

高精度轻量级图像分割SOTA模型PP-LiteSeg重磅开源!

百度大脑

细数云上综合治理始末,华为云联创营解码企业运维之道

极客天地

关于K8s中Service Account的一些笔记:Pod内部如何访问K8s集群

山河已无恙

k8s 4月月更

ECA 认证备考指南

Se7en

从概念、部署到优化,Kubernetes Ingress 网关的落地实践

阿里巴巴云原生

阿里云 Kubernetes 云原生 网关

Selenium自动化应该避免的测试场景

FunTester

在线Excel转SQL工具

入门小站

工具

参赛必看,2022语言与智能技术竞赛赛题任务解读直播!

百度大脑

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