基于Proxy Store的缓存机制

404错误驱动Web缓存

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


location  /  {

  root  /myweb/server/;                              # 主目录
  error_page 404  =200  /errpage$request_uri;        # 404定向到/errpage目录下
}
                                                     # 捕获404错误的重定向
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/在同一个硬盘分区内
}

配置将404错误响应进行重定向,然后使用location块捕获重定向请求,向后端服务器发起请求获取响应数据,然后将数据转发给客户端的同时缓存到本地。

资源不存在驱动Web缓存

通过location块的location if条件判断直接驱动Nginx服务器与后端服务器的通信和Web缓存。

#其他配置
location  /  {
#其他配置
  root /home/html/;
  internal;  #配置该目录不能通过外部链接直接访问
  alias /myweb/server/;
  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地址或者源地址
  }
}

在配置实例中使用location if条件判断支持的“!-f”判断请求的资源在Nginx服务器上是否存在,如果不存在就通过后端服务器获取数据,然后回传给客户端,同时使用Proxy Store进行缓存。

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

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

Last updated