9 缓存功能
9 缓存功能
TIP
本小节主要介绍以下知识:
- Web 缓存技术的基础知识
- Nginx 服务器基于 Proxy Store 的缓存机制
- Nginx 服务器基于 memcached 的缓存机制
- Nginx 服务器基于 Proxy Cache 的缓存机制
- Nginx 与 Squid 服务器组合的配置
概述
Nginx 服务器在该方面主要提供了两大方面的方案:一是负载均衡;二是 Web 缓存。
Web 缓存技术简述
略。
404 错误驱动 Web 缓存
依靠自身的 Proxy Store 功能对 404 错误进行重定向来实现。当 Nginx 服务器在处理客户端请求时,发现请求的资源数据不存在,会产生 404 错误,然后服务器通过捕获该错误,进一步转向后端服务器请求数据,最后将后端服务器的响应数据传回给客户端,同时在本地进行缓存。从实现原理上:Nginx 服务器向后端服务器发起数据请求并完成 Web 缓存,主要是由产生的 404 错误驱动的。
以下是一个简单的实现 404 错误驱动 Web 缓存的配置方案片段:
...
location / {
...
root /myweb/server/; #主目录
error_page 404 = 200 /errpage$request_uri; #404定向到 /errpage 目录下
}
location /errpage/ {
...
internal; #该目录不能通过外部链接直接访问
alias /home/html/;
proxy_pass http://backend/; #后端 upstream 地址或者源地址
proxy_set_header Accept-Encoding "'"; #后端不返回压缩(gzip/deflate)数据
proxy_store on; #指定 nginx 将代理返回达到文件保存
proxy_store_access user:rw group:rw all:r; #配置缓存数据的访问权限
proxy_temp_path /myweb/server/tmp; #/myweb/server/在同一个硬盘分区内
}
资源不存在驱动 Web 缓存
该方法同"404 错误驱动 Web 缓存"的方法在原理上大同小异,不同之处是,该方法是通过 location 块的 location if 条件判断直接驱动 Nginx 服务器与后端服务器的通信和 Web 缓存,而后者是对资源不存在引发的 404 错误进行捕获,进而驱动 Nginx 服务器与后端服务器的通信和 Web 缓存。
... #其他配置
location / {
... #其他配置
root /home/html;
internal; #配置该目录不能通过外部连接直接访问
alias /home/html/;
proxy_set_header Accept-Encoding "'"; #后端不返回压缩(gzip/deflate)数据
proxy_store on; #指定 nginx 将代理返回达到文件保存
proxy_store_access user:rw group:rw all:r; #配置缓存数据的访问权限
proxy_temp_path /myweb/server/tmp; #配置临时目录,该目录要和 /myweb/server/ 在同一个硬盘分区内
if(!-f $request_filename){ #判断请求资源是否存在
proxy_pass http://backend/; #配置后端 upstream 地址或者源地址
}
}
TIP
两种缓存机制也不支持动态链接请求。比如 getsource?id=1 和 getsource?id=2 这两个请求,这两种缓存机制会忽略 id=1 参数,从而造成返回的资源不正确等问题。这是这两种缓存机制的缺点,但在实际应用中有时也有一定的使用价值。
基于 memcached 的缓存机制的 6 个指令
mencached 是一个高性能的基于分布式的缓存系统,它在内存中开辟一块空间,然后建立一个 Hash 表,将缓存数据通过键/值存储在 Hash 表中进行管理。
在 Nginx 服务器的标准 HTTP 模块中有一个 ngx_http_memcached_module 模块,专门用于处理和 memcached 相关的配置和功能实现,其指令介绍如下。
memcached_pass 指令
该指令用于配置 memcached 服务器的地址。该语法结构为:memcached_pass address;
其中,address 为 memcached 服务器的地址。支持 IP + 端口的地址或者是域名地址。也可以使用 upstream 指令配置一个 memcached 服务器组,然后将 address 配置为 upstream 的名称。memcached_connect_timeout 指令
该指令用于配置连接 memcached 服务器的超时时间。该语法结构为:memcached_connect_timeout time;
其中,time 为设置的超时时间,默认为 60s。建议该时间不要超过 75s。memcached_read_timeout 指令
该指令用于配置 Nginx 服务器向 memcached 服务器发出两次 read 请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。该语法结构为:memcached_read_timeout time;
其中,time 为设置的超时时间,默认为 60s。memcached_send_timeout 指令
该指令用于配置 Nginx 服务器向 memcached 服务器发出两次 write 请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。该语法结构为:memcached_send_timeout time;
其中,time 为设置的超时时间,默认为 60s。memcached_buffer_size 指令
该指令用于配置 Nginx 服务器用于接收 memcached 服务器响应数据的缓存区大小。该语法结构为:memcached_buffer_size size;
其中,size 为设置的缓存区大小,一般是所在平台的内存页大小的倍数。默认设置为:memcached_buffer_size 4k|8k;
memcached_next_upstream 指令
该指令在配置了一组 memcached 服务器的情况下使用。服务器组中 memcached 服务器的访问规则遵循 upstream 指令配置的轮询规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一个组内服务器处理。该语法结构为:memcached_next_upstream status...;
其中,status 为设置的 memcached 服务器返回状态,可以是一个或者多个。这些状态包括:
- error,在建立连接、向 memcached 服务器发送请求或者读取响应头时服务器发生连接错误。
- timeout,在建立连接、向 memcached 服务器发送请求或者读取响应头时服务器发生连接超时。
- invalid_header,memcached 服务器返回的响应头为空或者无效。
- not_found,memcached 服务器未找到对应的键/值对。
- off,无法将请求发送给 memcached 服务器。
TIP
与 memcached 服务器进行数据传输的过程中的发送错误,不包含在该指令支持的状态之内。
以上是使用 memcached 缓存经常用到的一些指令。在实际配置 Nginx 服务器使用 memcached 时,我们需要对 Nginx 配置的全局遍历 $memcached_key 进行设置。如下:
... #其他配置
server {
location / {
... #其他配置
set #memcached_key "$uri?$args";
memcached_pass 192.168.1.4:8080;
error_page 404 502 504 = @fallback;
}
location @fallback{
proxy_pass http://backend;
}
... #其他配置
}
Proxy Cache 缓存机制
该机制是 Nginx 服务器自己实现的类似于 squid 的缓存机制,它使用 md5 算法将请求链接 hash 后生成文件系统目录保存响应数据。
Nginx 服务器在启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率,并且还会生成专门的管理进程对磁盘上的缓存文件进行过期判定、更新等方面的管理。Proxy Cache 缓存机制支持对任意链接响应数据的缓存,不仅限于 200 状态时的数据。从这几点来看,Proxy Cache 缓存机制不管在性能还是在数据管理上要远远优于 Proxy Cache 缓存机制。
Proxy Cache 缓存机制的一个缺陷是,它没有实现自动清理磁盘上缓存源数据的功能,因此在长时间使用过程中会对服务器存储造成一定的压力。
在下面这个配置实例中,实现了 Nginx 服务器 Proxy Cache 缓存机制的一般配置:
... #其他配置
http {
... #其他配置
proxy_cache_path /myweb/server/proxycache levels=1:2 max_size=2m inactive=5m
loader_sleep=1m; keys_zone=MYPROXYCACHE:10m; #配置了缓存数据存放路径和 Proxy Cache 使用的内存 Cache 空间
proxy_temp_path /myweb/server/tmp; #配置响应数据的临时存放目录
server {
... #其他配置
proxy_pass http://www.myweb.name/;
proxy_cache MYPROXYCACHE; #配置使用 MYPROXYCACHE 这个 keys_zone
proxy_cache_valid 200 302 1h; #配置 200 状态和 302 状态的响应缓存 1 小时
proxy_cache_valid 301 1d; #配置 301 状态的响应缓存 1 天
proxy_cache_valid any 1m; #配置其他状态的响应数据缓存 1 分钟
}
}
PS:实现对过期缓存的清理:可使用第三方模块ngx_cache_purge
nginx 与 squid 组合
Squid Cache(简称为 Squid)是目前在大访问量的网站建设中应用非常广泛的 Web 缓存服务器。
Squid 服务本身不支持在单台服务器统一端口下运行多个进程,这样的话就需要给每一个 Squid 服务分配一台服务器设备,这样非常浪费资源。我们可以运用 Nginx 的这一功能,实现在同一台服务器中运行多个 Squid服务的目的。
具体配置就是把 Squid 使用 upstream 服务器组配置,然后做负载均衡。
基于第三方模块 ncache 的缓存机制
如 ncache,说明略。
参考文献
- [Nginx 高性能 Web 服务器详解]