Nginx缓存使用

我们都知道,应用程序和网站一样,其性能关乎生存。但如何使你的应用程序或者网站性能更好,并没有一个明确的答案。代码质量和架构是其中一个原因,但是在很多列子中我们看到,你可以通过关注一些十分基础的应用内容分发技术,来提高终端用户的体验。其中一个列子就是实现和调整应用栈的缓存。

基础:

一个web缓存坐落于客户端和“原始服务器之间”,它保留了所有可见内容的拷贝。如果一个客户端请求的内容在缓存中存储,则可以直接在缓存中获得该内容而不需要与服务器通信。这样一来,由于web缓存距离客户端“更近”,就可以提高响应性能,并更有效率的使用应用服务器,因为服务器不用每次请求都进行页面生成工作。


在浏览器和应用服务器之间,存在多种“潜在”缓存,如:客户端浏览器缓存,中间缓存,内容分发网络(CDN)和服务器上的负载平衡和反向代理。缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。

并不是只有大规模的内容分发网络可以在使用缓存中受益--缓存还可以提高负载平衡器,反向代理和应用服务器前端web服务的性能。此外web缓存还可以网站的可靠性。当服务器宕机或繁忙时,比起返回错误信息给用户,不如通过配置NGINX将已经缓存下来的内容发送给用户,这意味着,网站在应用服务器或者数据库故障的情况下,可以保持部分甚至全部的功能运转。

如何安装和配置基础缓存

我们只需要两个命令就可以启用基础缓存:

proxy_cache_path和proxy_cache.  proxy_cache_path用来设置缓存的路径和配置,proxy_cache用来启用缓存。

proxy_cache_path

    /path/to/cache levels=1:2

    keys_zone=my_cache:10m

    max_size=10g inactive=60m

    use_temp_path=off

  server {

    ...

        location / {

            proxy_cache

    my_cache;

            proxy_pass

    http://my_upstream;

        }

}

proxy_cache_path命令中的参数及对应配置说明如下 :

  用于缓存本地磁盘目录是/path/to/cache/

   levels在/path/to/cache/设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,推荐使用两级目录层次结构。如果levels没有配置,则NGINX会将所有的文件放到同一目录中。

   keys_zone是一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计算器的用途。将键的拷贝放入内存可以使NGINX在不检索磁盘的情况下快速决定一个请求是`HIT`还是`MISS`,这样大大提高了检索的速度。一个1MB的内存空间可以存储大约8000个key,那么上面配置的10MB内存空间可以存储差不多80000个key。

   max_size设置了缓存的上限(上面的例子是10g)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有的磁盘空间。当缓存达到上限,处理器便调用cache manager来移除最近最少被使用的文件,这样把缓存空间降低至这个限制之下。

     inactive指定了项目在不被访问的情况下能够在内存中保持的时间。上面的例子中,如果一个文件在60分钟之内没有被请求,则缓存管理会自动将其在内存中删除,不管文件是否过期,默认值是10分钟(10m)。过期内容只会在inactinve指定的时间内没有被请求才会删除。如果过期内容被访问,那么NGINX将会从原服务器上刷新,并更新对应的inactive计时器。

    最终,proxy_cache命令启动缓存那些URL与location部分匹配的内容(本列中,为`/`).你同样可以将proxy_cache命令添加到server部分,这将会把缓存应用到所有那些location未指定自己proxy_cache命令的服务中。


陈旧总比没有强

NGINX内容缓存的一个非常强大的性能是:当无法从原始服务器获取最新内容时,NGINX可以分发缓存中的陈旧内容。这种情况一般发生在关联缓存内容的原始服务器出现宕机或者繁忙时。比起对客户端传达错误信息,NGINX可发送在其内存中的陈旧文件。NGINX的这种代理方式,未服务器提供额外级别的容错能力,并确保了服务器故障或流量峰值的情况下的正常运行。开启该功能,只需要添加proxy_cache_use_stale命令即可:

  location / {

      ...

      proxy_cache_use_stale

      error timeout http_500

      http_502 http_503 http_504;

  }

  按照上面的例子中的配置,当NGINX收到服务器返回的error,timeout或者其它指定的5xx错误,并且在缓存中有请求文件的陈旧文件,则会将这些陈旧版本的文件而不是错误信息发送给客户端。


缓存微调

NGINX提供了丰富的可选项配置用于缓存性能的微调。

下面是使用了几个配置的例子:

    proxy_cache_path

    /path/to/cache levels=1:2

    keys_zone=my_cache:10m

    max_size=10g inactive=60m

    

    use_temp_path=off;

    server {

        ...

        location /{

            proxy_cache

    my_cache;

    

    proxy_cache_revalidate on;

            proxy_cache_min_uses 3;

            

    proxy_cache_use_stale error

    timeout updating http_500

    http_502 http_503 http_504;

            proxy_cache_lock on;

            

            proxy_pass

    http://my_upstream;

        }

}

这些命令配置了下列的行为:

proxy_cache_revalidate指示NGINX在刷新来自服务器的内容时使用GET请求。如果客户端请求项已经被缓存过了,但是在缓存控制头部中定义为过期,那么NGINX就会在GET请求中包含if-Modified-Since字段,发送至服务器端。这项配置可以节约带宽,因为对于NGINX已经缓存过的文件,服务器只会在该文件请求头中Last-Modified纪录的时间内被修改时才将全部文件一起发送。

proxy_cache_min_uses设置了在NGINX缓存前,客户端请求一个条目的最短时间。当缓存不断被填满时,这项设置非常有用,因为这确保了只有那些被经常访问的内容才会被添加到缓存中,该项默认值为1。

proxy_cache_use_stale中的updating参数告知NGINX在客户端请求的项目的更新正在原始服务器中下载时发送旧内容,而不是向服务器转发重复的请求。第一个请求陈旧文件的用户不得不等待文件在原始服务器中更新完毕。陈旧的文件会返回给随后的请求直到更新后的文件被全部下载。

proxy_cache_lock被启动时,当多个客户端请求一个缓存中不存在的文件(或者称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。如果不启勇proxy_cache_lock,则所有在缓存中找不到文件的请求都会直接与服务器通信。




你可能感兴趣的:(Nginx缓存使用)