实现10倍应用性能提升的10个技
发布时间: 2023-07-11

Floyd Smith

职位:NGINX 内容营销总监

公司:F5

Web 应用性能优化迫在眉睫。线上经济活动份额不断增长,发达世界的互联网经济已占经济总量的 5% 以上(请参见下文的互联网统计数据来源)。在这个始终在线、超级互联的现代世界,用户的期望已经今非昔比。如果您的网站没有立即做出响应,或者如果您的应用无法毫不延迟地运行,用户转身就会投向您的竞争对手。

例如,Amazon 近 10 年前的一项研究证明,页面加载时间每减少 100 毫秒,收入就会增加 1% —— 10 年前就已如此,更何况是现在。最近的另一项研究也强调指出,超过一半的受访网站所有者表示他们由于应用性能不佳失去了收入或客户。

一个网站到底多快才行?页面加载每延长 1 秒钟,就有大约 4% 的用户走掉。主要电商网站的首次交互时间从 1 秒到 3 秒不等,这个区间的转化率最高。Web 应用性能的重要性由此可见,并且可能还会与日俱增。

展开全文

想要提高性能很容易,难的是怎么看到结果。为此,本文提出了帮您实现 10 倍网站性能提升的 10 个技巧。本文是一系列博文的开帖之作,详细介绍了如何借助一些久经考验的优化技术以及 NGINX 的一些支持提高应用性能。该系列还概括介绍了您可能因此而获得的安全性方面的改进。

技巧 1

使用反向代理服务器加速并保护应用

如果您的 Web 应用在一台机器上运行,那要提升其性能非常简单:换一台更快的机器、多加几颗处理器、增加 RAM、换成高速磁盘阵列即可,这样新机器就可以更快地运行 WordPress 服务器、Node.js 应用和 Java 应用了。(如果您的应用需要访问数据库服务器,解决办法仍然很简单:找两台更快的机器,用更快的网络连起来就行了。)

问题是,机器的速度可能并不是问题所在。Web 应用通常运行很慢,因为计算机要在不同类型的任务之间切换:通过数千个连接与用户交互、访问磁盘文件、运行应用代码等等。应用服务器可能会因此而崩溃 —— 内存耗尽、将内存块交换到磁盘、让许多请求等待一个任务(比如磁盘 I/O)等。

除了升级硬件之外,您还可以采用一种完全不同的方法:添加反向代理服务器来卸载一些任务。反向代理服务器位于运行应用的机器的前面,负责处理互联网流量。只有反向代理服务器直接连接到互联网,与应用服务器的通信是通过一个高速内网进行的。

反向代理服务器可以让应用服务器不必再等待用户与 Web 应用的交互,而是专注于构建页面,剩下的发送任务则交由反向代理来执行。由于无需等待客户端响应,应用服务器可以以接近优化基准测试所达到的速度运行。

添加反向代理服务器还可以增加 Web 服务器设置的灵活性。例如,如果执行既定任务的服务器过载了,您可以轻松添加一台同类型的服务器;如果一台服务器宕机,那么替换它也不难。

鉴于这种灵活性,反向代理服务器往往也是许多其他性能优化手段的先决条件,例如:

负载均衡( 见技巧 2)

在反向代理服务器上运行负载均衡器,以便在多个应用服务器之间均匀地共享流量。借助负载均衡器,您无需更改应用即可添加应用服务器。

缓存静态文件( 见技巧 3)

直接请求的文件(如图像文件或代码文件)可以存储在反向代理服务器上,并直接发送到客户端,这样不仅可以更快地提供资产,还能减轻应用服务器的负担,进而加快应用运行速度。

保护站点安全

NGINX 软件一开始的设计定位就是具有上述附加功能的反向代理服务器。NGINX 采用了事件驱动型处理方法,因此比传统服务器效率更高。NGINX Plus 增添了更多高级反向代理功能,比如应用 健康检查、特定请求的路由、高级缓存,并提供技术支持。

技巧 2

添加负载均衡器

添加负载均衡器相对简单,但却能显著提升站点性能和安全性。您不需要升级核心 Web 服务器的硬件性能或规模,而是直接使用负载均衡器将流量分发到多台服务器。即使应用写得不好或者难以扩展,负载均衡器也可以在应用不做出任何更改的情况下改善用户体验。

负载均衡器首先是一个反向代理服务器( 见技巧 1),负责接收互联网流量并将请求转发给其他服务器。这里的关键在于负载均衡服务器可以支持两台或更多应用服务器,使用 您选择的算法在不同的服务器间分配请求。最简单的负载均衡方法是轮询,其中每个新请求都会被发送到列表中的下一台服务器。将请求发送到活动连接数最少的服务器也是常用的方法之一。NGINX Plus 还具有会话保持功能,即将当前用户的多个会话保持在同一台服务器上。

负载均衡器可以避免出现一台服务器过载而其他服务器过闲的情况,从而显著提性能。此外,Web 服务器扩容也会变得简单,您可以添加相对便宜的服务器,并确保物尽其用。

可以进行负载均衡的协议包括 应用,确定它的类型以及性能短板是什么。

用于负载均衡的一台或若干台服务器还可以同时处理其他任务,例如 SSL 终止、按客户端来选择 的使用、静态文件缓存等。

技巧 3

缓存静态和动态内容

缓存可以通过更快地向客户端交付内容来改善 Web 应用的性能。缓存可以运用多种策略:预处理内容以便在需要时快速交付内容、将内容存储在更快的设备上、将内容存储在靠近客户端的地方等等,这些策略也可以组合运用。

缓存有两种类型:

静态内容缓存

图像文件 (JPEG、PNG) 和代码文件 (CSS、Java) 等不常更改的文件可以存储在边缘服务器上,以便快速从内存或磁盘中检索。

动态内容缓存

许多 Web 应用都会为每个页面请求生成新的 HTML。通过短暂缓存一份生成的 HTML 副本,您可以大大减少必须要生成的页面总数,同时仍然提供足够满足需求的新鲜内容。

例如,假设一个页面每秒被查看 10 次,那么缓存 1 秒就代表这个页面有 90% 的请求来自缓存。如果您单独缓存各个静态内容,那么即使是全新生成的页面,也可能大部分来自缓存的内容。

缓存 Web 应用生成的内容主要会用到三种技术:

将内容放到更靠近用户的地方

离用户越近,传输时间越少。

将内容放到更快的机器上

机器越快,检索越快。

将内容从过度使用的机器上移除

在执行某个特定任务时,机器的运行速度有时会比基准性能慢得多,因为它们忙于其他任务。在不同的机器上缓存可以提高缓存资源和非缓存资源的性能,因为主机过载较少。

Web 应用缓存可以由内(Web 应用服务器)而外的实施。首先,缓存动态内容,以减少应用服务器的负载。其次,缓存静态内容(包括动态内容的临时副本),以进一步减少应用服务器的负载。然后,将缓存从应用服务器转移到更快和/或更靠近用户的机器上,从而减轻应用服务器的负担,缩短检索和传输时间。

优化的缓存可以极大地加快应用速度。对于很多网页来说,静态数据(例如大图像文件)往往占据一半以上的内容。如果不缓存,检索和传输此类数据可能会花好几秒钟,但是如果将数据缓存在本地,可能只花几分之一秒。

对于缓存的实践应用,我们可以看这样一个例子:NGINX 和 NGINX Plus 使用两个指令来设置缓存:proxy_cache_path 和 proxy_cache。您可以指定缓存的位置和大小、文件的最长缓存时间以及其他参数。

您甚至还可以使用指令 proxy_cache_use_stale(相当受欢迎),指示缓存在本应提供新鲜内容的服务器太忙或停机时提供旧文件,毕竟对客户端来说,有总比没有强。这可能会极大地改善您的网站或应用的正常运行时间,给用户树立一种十分稳定的形象。

NGINX Plus 具有高级缓存功能,包括支持缓存清除、在仪表盘上以可视化的形式显示缓存状态(以监控实时活动)等。

有关 NGINX 缓存的更多信息,请参见参考文档和《NGINX Plus 管理员指南》。

注意:缓存跨越了应用开发人员、资本投资决策人员和实时网络运营人员之间的组织界线。复杂的缓存策略(比如本文提到的这些)很好地体现了 DevOps 的价值,其中应用开发人员、架构师和运营人员携手合作,朝着保障网站功能、响应时间、安全和业务成效(比如完成的交易或销售)的目标共同发力。

技巧 4

压缩数据

压缩是一个重要的、潜在的性能加速器。图片(JPEG 和 PNG)、视频 (MPEG-4) 和音乐 (MP3) 等文件都有着精心打造和非常高效的压缩标准,其中任何一个标准都可以将文件缩小一个数量级甚至更多。

HTML(包括纯文本和 HTML 标签)、CSS 和代码(如 Java)等文本数据经常在不压缩的情况下进行传输。压缩这些数据可能会对感知到的 Web 应用性能产生特别明显的影响,尤其是对速度缓慢或移动连接受限的客户端来说。

这是因为文本数据通常足以让用户与页面进行交互,而多媒体数据可能更多的体现支持性或锦上添花

微信