# Nginx 缓存机制

# Web 缓存概述

传统观点认为,影响网络访问速度的主要因素有网络带宽、访问距离和服务器的处理能力。随着网络接入速度的不断提升,主干带宽的不断扩容,目前的网络环境已经得到了极大的改善,影响网络访问速度的主要瓶颈出现在服务器的承载能力和处理能力方面。在实际使用Web服务器的过程中,我们能够看到绝大多数的产品在提高自身负载能力的方面提供了各式各样有效的办法,比如使用镜像服务器、使用缓存服务器、实施负载均衡等。

响应速度历来是衡量Web应用和服务性能优劣的重要指标之一,尤其在动态网站在网络上泛滥的今天,除了优化发布内容本身以外,另一个主要的办法就是把不需要实时更新的动态页面输出结果转化成静态网页形成缓存,进而按照静态网页来访问。这样的机制使得动态网站的响应速度显著提升。Web缓存技术被认为是减轻服务器负载、降低网络拥塞、增强网络可扩展性的有效途径之一,其基本思想是利用客户访问的时间局部性原理,将客户访问过的内容建立一个副本,在一段时间内存放在本地,当该数据下次被访问时,不必连接到后端服务器,而是由本地保留的副本数据响应。

具体来说,该技术主要在Web服务器和客户端之间实现,Web服务器首先根据客户端的请求从后端服务器获取响应数据,并传回给客户端,同时,Web服务器将该响应数据在本地建立副本保存。当下次有相同的客户端请求时,Web服务器直接使用本地的副本响应访问请求,而不是向后端的服务器再次发送请求。

保存在本地的这些副本具有一个过期时间(也叫新鲜度),超过该时间将会更新。判断一个副本数据是否为过期数据的办法有很多,可以使用保留时间来判断,也可以使用数据完整度来判断。许多Web服务器还具有校验功能,就是当某些副本数据过期以后,先向后端服务器发送校验请求,后端服务器对这些数据进行校验,如果发现原数据和副本没有差别,则将过期副本重新置为可用副本。Web缓存技术的优点是很明显的。由于客户端的部分请求内容直接从Web服务器处获取,该技术减轻了后端服务器的负载,同时也减少了Web服务器与后端服务器之间的网络流量,从而减轻了网络拥塞,同时还能减小数据传输延迟,有效降低客户访问延迟。该技术还能实现另一个很实用的功能,如果由于后端服务器故障或网络故障造成后端服务器无法响应客户请求,客户端可以从Web服务器中获取缓存的内容副本,这增强了数据的可用性,使得后端服务器的鲁棒性得到了加强。

# 404错误驱动 Web 缓存

Nginx服务器的这一种实现Web缓存的原理其实很简单,主要还是依靠自身的Proxy Store功能对404错误进行重定向来实现。当Nginx服务器在处理客户端请求时,发现请求的资源数据不存在,会产生404错误,然后服务器通过捕获该错误,进一步转向后端服务器请求数据,最后将后端服务器的响应数据传回给客户端,同时在本地进行缓存。从实现原理上来看,Nginx服务器向后端服务器发起数据请求并完成Web缓存,主要是由产生的404错误驱动的。

# 资源不存在的驱动 Web 缓存

该方法同“404错误驱动Web缓存”的方法在原理上大同小异,不同之处是,该方法是通过location块的location if条件判断直接驱动Nginx服务器与后端服务器的通信和Web缓存,而后者是对资源不存在引发的404错误进行捕获,进而驱动Nginx服务器与后端服务器的通信和Web缓存。

以上两种缓存机制在原理上是相近的,在实际的应用中,我们通常可以将Proxy Store的缓存目录配置到/dev/shm中提高缓存数据的处理速度。如果不是在内存中保存缓存数据,这两种缓存机制不支持缓存数据的清理机制,缓存文件会一直保存在本地占用硬盘空间。

这两种缓存机制还有需要注意的地方是它们只能缓存200状态代码下的响应数据,这就是为什么我们在介绍“404错误驱动Web缓存”机制时的配置实例中将404错误重新改写为200状态的原因。

两种缓存机制也不支持动态链接请求。比如getsource?id=1和getsource?id=2这两个请求,这两种缓存机制会忽略id=1参数,从而造成返回的资源不正确等问题

对于带有参数的链接,Squid服务器是支持的,因此带有不同参数的相同域名请求Squid服务器是被区别对待的,而Nginx服务器将不会区分这样的请求,这在一定的情况下对后端服务器能够起到一定的保护作用。

# memcached 分布式缓存系统简介

memcached是一套高性能的基于分布式的缓存系统,用于动态Web应用以减轻后台数据服务器的负载。它可以独立于任何程序单独作为后台程序运行,通过在内存中的缓存数据来减少对后台数据服务器的请求,从而提高对客户端的响应。

memcached可以处理并发的网络连接。它在内存中开辟一块空间,然后建立一个Hash表,将缓存数据通过键/值存储在Hash表中进行管理。memcached由服务端和客户端两个核心组件组成,服务端先通过计算“键”的Hash值来确定键/值对在服务端所处的位置。当确定键/值对的位置后,客户端就会发送一个查询请求给对应的服务端,让它来查找并返回确切的数据。

在Nginx服务器的标准HTTP模块中有一个ngx_http_memcached_module模块,专门用于处理和memcached相关的配置和功能实现,虽然在目前的版本中还没有支持完整的功能,但是其性能很好,对于一般的应用场景是比较好的选择方案。

# Proxy Cache 缓存机制

Nginx服务器在启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率,并且还会生成专门的管理进程对磁盘上的缓存文件进行过期判定、更新等方面的管理。Proxy Cache缓存机制支持对任意链接响应数据的缓存,不仅限于200状态时的数据。

Proxy Cache缓存机制的一个缺陷是,它没有实现自动清理磁盘上缓存源数据的功能,因此在长时间使用过程中会对服务器存储造成一定的压力。

Last Updated: 3/5/2021, 5:44:42 PM