问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

从缓存到HTTP/2:10个Web应用性能优化实战技巧

创作时间:
2025-01-21 21:39:00
作者:
@小白创作中心

从缓存到HTTP/2:10个Web应用性能优化实战技巧

在当今这个数字化时代,Web应用的性能直接影响着用户体验和业务发展。无论是大型企业还是初创公司,都需要确保自己的Web应用能够快速响应用户请求,提供流畅的使用体验。本文将为你提供10个实用的优化建议,帮助你将Web应用性能提升至新的高度。

Tip #3:缓存静态和动态内容

缓存是提高Web应用性能的关键技术之一。通过缓存,可以加速内容传输,减少服务器负载,提升用户体验。缓存策略主要包括:

  1. 静态内容缓存:对于不经常变化的文件,如图像(JPEG、PNG)和代码(CSS、JavaScript),可以将其保存在外围服务器上,以便快速从内存或磁盘中提取。

  2. 动态内容缓存:许多Web应用会为每次页面请求生成新的HTML页面。通过在短时间内缓存生成的HTML内容,可以显著减少需要生成的页面数量,同时保持页面的新鲜度。

缓存技术的主要方法包括:

  1. 缩短数据与用户的网络距离:将内容副本放置在离用户更近的节点,以减少传输时间。

  2. 提高内容服务器的速度:将数据保存在更快的服务器上,以减少文件提取时间。

  3. 从过载服务器上移走数据:通过将数据缓存在不同的机器上,可以平衡负载,提高缓存和非缓存资源的性能。

在Web应用服务器内部实现缓存机制时,可以:

  1. 首先缓存动态内容,以减少应用服务器加载动态内容的时间。

  2. 其次缓存静态内容(包括动态内容的临时副本),以进一步减轻应用服务器的负载。

  3. 将缓存数据转移到对用户而言更快、更近的机器上,以减少应用服务器的压力,降低数据提取和传输时间。

以NGINX和NGINX Plus为例,它们提供了强大的缓存功能。通过proxy_cache_pathproxy_cache指令,可以设置缓存的位置、大小、文件保存时间等参数。proxy_cache_use_stale指令允许在源服务器繁忙或故障时提供较旧的内容,从而提高网站或应用的可用性。

NGINX Plus还提供了高级缓存特性,如缓存清除支持和仪表盘上的缓存状态信息显示。更多关于NGINX缓存机制的信息,可以参考NGINX Plus管理员指南中的《参考文档》和《NGINX内容缓存》。

Tip #4:压缩数据

数据压缩是提高Web应用性能的有效手段。目前,各种文件类型都有专门的压缩标准,如JPEG和PNG用于图像,MPEG-4用于视频,MP3用于音频,这些标准都能实现较高的压缩率。

对于文本数据,如HTML、CSS和JavaScript,压缩的效果尤为显著。智能内容压缩可以减少这些文本内容对带宽的需求,通常可以减少30%甚至更多的带宽使用,从而缩短页面加载时间。

即使在使用SSL的情况下,压缩也能减少需要进行SSL编码的数据量,从而抵消压缩数据所需的时间。常见的压缩方法包括:

  1. 在HTTP/2中,对头部数据进行专门优化的压缩模式。

  2. 在NGINX中启用GZIP压缩。通过gzip_static指令,可以直接处理预压缩的.gz版本文件。

Tip #5:优化SSL/TLS

安全套接字层(SSL)协议及其后续版本传输层安全(TLS)协议正被越来越多的网站采用。SSL/TLS对从原始服务器发往用户的数据进行加密,提高了网站的安全性。Google也将SSL/TLS作为搜索引擎排名的一个正面影响因素。

然而,SSL/TLS的使用也带来了性能挑战:

  1. 每个连接的首次握手需要传递密钥,HTTP/1.x浏览器在建立多个连接时会重复此过程。

  2. 数据传输过程中需要持续进行服务器端加密和客户端解密。

为了提高SSL/TLS的性能,可以采取以下措施:

  1. 会话缓冲:使用ssl_session_cache指令缓存每个新SSL/TLS连接的参数。

  2. 会话票据或ID:将SSL/TLS信息保存在票据或ID中,以便流畅复用,避免重新握手。

  3. OCSP分割:通过缓存SSL/TLS证书信息来减少握手时间。

NGINX和NGINX Plus可以作为SSL/TLS服务端,处理客户端流量的加密和解密,同时以明文方式与其他服务器通信。

Tip #6:使用HTTP/2或SPDY

对于已经使用SSL/TLS的站点,HTTP/2和SPDY可以显著提高性能,因为每个连接只需要一次握手。对于未使用SSL/TLS的站点,从响应速度的角度来看,迁移到HTTP/2和SPDY的压力较小。

Google于2012年开始推荐SPDY作为比HTTP/1.x更快的协议。HTTP/2是目前IETF通过的标准,基于SPDY。SPDY已被广泛支持,但很快将被HTTP/2取代。

SPDY和HTTP/2的关键特性是使用单一连接替代多路连接。单一连接可以复用,同时携带多个请求和响应的分片。这避免了在HTTP/1.x浏览器中建立和管理多个连接的开销,特别适用于SSL/TLS,因为它可以最小化安全链接的握手时间。

SPDY需要使用SSL/TLS,而HTTP/2官方标准不要求SSL/TLS,但目前所有支持HTTP/2的浏览器只有在启用了SSL/TLS的情况下才能使用它。这意味着支持HTTP/2的浏览器只有在网站使用SSL且服务器接收HTTP/2流量时才会启用HTTP/2,否则将使用HTTP/1.x。

实现SPDY或HTTP/2后,不再需要常规的HTTP性能优化方案,如按域分割、资源聚合和图像拼合。这使得代码和部署变得更简单、更易于管理。

NGINX从一开始就支持SPDY,大部分使用SPDY协议的网站都运行NGINX。NGINX Plus从2015年9月开始支持HTTP/2,开源版NGINX也支持HTTP/2。

Tip #7:升级软件版本

选择合适的软件版本是提高应用性能的简单方法。建议根据软件的稳定性和性能评价来选择软件栈。高性能组件的开发者通常更注重性能提升和bug修复,因此使用最新版本的软件很有价值。

新版本通常具有更好的兼容性和性能,更容易获得开发者和用户社区的支持。更新的版本往往利用了新的编译器优化,包括对新硬件的调优。保持软件更新可以确保最佳优化、bug修复和安全性。

使用旧版软件会阻碍你利用新特性。例如,HTTP/2需要OpenSSL 1.0.1,从2016年中期开始需要1.0.2,而1.0.2是在2015年1月发布的。

NGINX用户可以迁移到最新的NGINX开源版本或NGINX Plus,它们包含了最新的功能,如socket分割和线程池。检查你的软件栈并将其升级到最新版本。

Tip #8:Linux系统性能调优

Linux是大多数Web服务器使用的基础操作系统,因此在架构中具有很大的性能优化潜力。默认情况下,许多Linux系统被设置为使用较少的资源,以满足典型的桌面应用需求。对于Web应用来说,需要对系统进行一些调整以达到最佳性能。

以NGINX为例,以下是一些关键的Linux性能优化措施:

  1. 缓冲队列:如果存在挂起的连接,可以考虑增加net.core.somaxconn的值,该值表示可以缓存的最大连接数。如果连接限制太小,会看到错误信息,可以逐步增加该参数直到错误消失。

  2. 文件描述符:NGINX对每个连接使用最多2个文件描述符。如果系统有大量连接请求,可能需要提高sys.fs.file_max,以增加系统对文件描述符数量的整体限制,从而支持不断增加的负载需求。

  3. 临时端口:使用代理时,NGINX会为每个上游服务器创建临时端口。可以通过设置net.ipv4.ip_local_port_range来增加这些端口的范围,提高可用端口号。还可以通过减少非活动端口的超时时间(使用net.ipv4.tcp_fin_timeout)来快速重用端口,从而提高流量处理能力。

Tip #9:Web服务器性能调优

无论使用哪种Web服务器,都需要对其进行优化以提高性能。以下是一些通用的优化建议,部分设置针对NGINX:

  1. 访问日志:不要将每个请求的日志直接写回磁盘,可以在内存中缓存日志,然后批量写回。对于NGINX,可以使用access_log指令的buffer=size参数来控制缓存大小,使用flush=time参数来设置写回时间间隔。

  2. 缓存:在内存中缓存部分响应,直到缓存满为止,这可以提高与客户端的通信效率。对于NGINX,可以使用proxy_buffer_sizeproxy_buffers指令来管理缓存。

  3. 客户端保活:保活连接可以减少开销,特别是使用SSL/TLS时。对于NGINX,可以从默认值100开始增加keepalive_requests的最大连接数,允许客户端在一个指定连接上进行多次请求。还可以通过增加keepalive_timeout的值来延长保活连接的存活时间,使后续请求处理得更快。

  4. 上游保活:上游连接(连接到应用服务器、数据库服务器等)同样受益于连接保活。对于上游连接,可以增加keepalive参数,即每个工作进程的空闲保活连接数。这可以提高连接复用次数,减少重新打开新连接的次数。

  5. 限制:限制客户端使用的资源可以提高性能和安全性。对于NGINX,可以使用limit_connlimit_conn_zone限制特定来源的连接数量,使用limit_rate限制带宽。这些限制可以防止合法用户过度使用资源,同时避免攻击。limit_reqlimit_req_zone用于限制客户端请求。对于上游服务器,可以在upstream配置块的server指令中使用max_conns参数限制连接数,queue指令用于在达到max_conns限制时保存特定数量的请求。

  6. 工作进程:工作进程负责处理请求。NGINX采用事件驱动模型和操作系统特定的机制,有效地将请求分发给不同的工作进程。建议将worker_processes设置为每个CPU一个。worker_connections的最大数(默认512)可以根据需要在大多数系统上增加,通过实验找到最适合系统的值。

  7. 套接字分割:通常一个套接字监听器会将新连接分配给所有工作进程。套接字分割为每个工作进程创建一个套接字监听器,当套接字监听器可用时,内核会将连接分配给它。这可以减少锁竞争,提高多核系统的性能。要启用套接字分割,需要在listen指令中添加reuseport参数。

  8. 线程池:慢操作可以分配到不同的任务集,主进程则持续运行快速操作。当磁盘操作完成后,结果会返回给主进程的循环。在NGINX中,read()系统调用和sendfile()操作被分配到线程池。

技巧:在更改任何操作系统或支持服务的设置时,一次只更改一个参数并测试性能。如果修改引起问题或没有使系统更快,可以恢复原设置。

Tip #10:监视系统活动以解决问题和瓶颈

在应用开发中,要使系统变得非常高效,关键在于监视系统在现实世界中的运行性能。必须能够通过特定设备和Web基础设施监控程序活动。

监视活动是最积极的——它会告诉你发生了什么,把问题留给你发现和最终解决掉。

监视可以发现几种不同的问题。它们包括:

  1. 服务器宕机。
  2. 服务器出问题一直在丢失连接。
  3. 服务器出现大量的缓存未命中。
  4. 服务器没有发送正确的内容。

应用的总体性能监控工具,比如New RelicDynatrace,可以帮助你监控到从远程加载网页的时间,而 NGINX 可以帮助你监控到应用交付端。当你需要考虑为基础设施添加容量以满足流量需求时,应用性能数据可以告诉你你的优化措施的确起作用了。

为了帮助开发者快速的发现、解决问题,NGINX Plus 增加了应用感知健康度检查 ——对重复出现的常规事件进行综合分析并在问题出现时向你发出警告。NGINX Plus 同时提供会话过滤功能,这可以阻止当前任务完成之前接受新的连接,另一个功能是慢启动,允许一个从错误恢复过来的服务器追赶上负载均衡服务器群的进度。当使用得当时,健康度检查可以让你在问题变得严重到影响用户体验前就发现它,而会话过滤和慢启动可以让你替换服务器,并且这个过程不会对性能和正常运行时间产生负面影响。下图就展示了内建的 NGINX Plus 模块实时活动监视的仪表盘,包括了服务器群,TCP 连接和缓存信息等 Web 架构信息。

总结:看看10倍性能提升的效果

这些性能提升方案对任何一个 web 应用都可用并且效果都很好,而实际效果取决于你的预算、你能花费的时间、目前实现方案的差距。所以你该如何对你自己的应用实现10倍性能提升?

为了指导你了解每种优化手段的潜在影响,这里是上i面详述的每个优化方法的关键点,虽然你的情况肯定大不相同:

  1. 反向代理服务器和负载均衡。没有负载均衡或者负载均衡很差都会造成间歇的性能低谷。增加一个反向代理,比如 NGINX ,可以避免 web 应用程序在内存和磁盘之间波动。负载均衡可以将过载服务器的任务转移到空闲的服务器,还可以轻松的进行扩容。这些改变都可以产生巨大的性能提升,很容易就可以比你现在的实现方案的最差性能提高10倍,对于总体性能来说可能提高的不多,但是也是有实质性的提升。

  2. 缓存动态和静态数据。如果你有一个负担过重的 web 服务器,那么毫无疑问肯定是你的应用服务器,只通过缓存动态数据就可以在峰值时间提高10倍的性能。缓存静态文件可以提高几倍的性能。

  3. 压缩数据。使用媒体文件压缩格式,比如图像格式 JPEG,图形格式 PNG,视频格式 MPEG-4,音乐文件格式 MP3 可以极大的提高性能。一旦这些都用上了,然后压缩文件数据可以将初始页面加载速度提高两倍。

  4. 优化 SSL/TLS。安全握手会对性能产生巨大的影响,对它们的优化可能会对初始响应产生2倍的提升,特别是对于大量文本的站点。优化 SSL/TLS 下媒体文件只会产生很小的性能提升。

  5. 使用 HTTP/2 和 SPDY。当你使用了 SSL/TLS,这些协议就可以提高整个站点的性能。

  6. 对 Linux 和 web 服务器软件进行调优。比如优化缓存机制,使用保活连接,分配时间敏感型任务到不同的线程池可以明显的提高性能;举个例子,线程池可以加速对磁盘敏感的任务近一个数量级。

我们希望你亲自尝试这些技术。我们希望知道你说取得的各种性能提升案例。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号