本节介绍如何启用和配置从代理服务器接收的响应的缓存。主要涉及以下内容 -

  • 缓存介绍
  • 启用响应缓存
  • 涉及缓存的NGINX进程
  • 指定要缓存的请求
  • 限制或绕过缓存
  • 从缓存中清除内容
    • 配置缓存清除
    • 发送清除命令
    • 限制访问清除命令
    • 从缓存中完全删除文件
    • 缓存清除配置示例
  • 字节缓存
  • 组合配置示例

1. 介绍

当启用缓存时,NGINX将响应保存在磁盘缓存中,并使用它们来响应客户端,而不必每次都为同一内容代理请求。

2. 启用响应缓存

要启用缓存,请在顶层的http上下文中包含proxy_cache_path指令。 强制的第一个参数是缓存内容的本地文件系统路径,强制keys_zone参数定义用于存储有关缓存项目的元数据的共享内存区域的名称和大小:

  1. http {
  2. ...
  3. proxy_cache_path /data/nginx/cache keys_zone=one:10m;
  4. }
 

然后在要缓存服务器响应的上下文(协议类型,虚拟服务器或位置)中包含proxy_cache指令,将由keys_zone参数定义的区域名称指定为proxy_cache_path指令(在本例中为一):

  1. http {
  2. ...
  3. proxy_cache_path /data/nginx/cache keys_zone=one:10m;
  4. server {
  5. proxy_cache one;
  6. location / {
  7. proxy_pass http://localhost:8000;
  8. }
  9. }
  10. }
 

请注意,由keys_zone参数定义的大小不会限制缓存的响应数据的总量。 缓存响应本身存储在文件系统上的特定文件中的元数据副本。 要限制缓存的响应数据量,请将max_size参数包含到proxy_cache_path指令中(但请注意,缓存数据的数量可能会临时超出此限制,如以下部分所述。)

3. 涉及缓存的NGINX进程

缓存中还有两个额外的NGINX进程:

  • 缓存管理器周期性地被激活以检查缓存的状态。 如果缓存大小超过了由max_cize_path指令设置的max_size参数,缓存管理器将删除最近访问的数据。如前所述,高速缓存管理器激活之间的缓存数据量可以临时超过限制。

  • NGINX启动后,缓存加载程序只运行一次。 它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会在启动后的最初几分钟内消耗足够的资源来减慢NGINX的性能。 为了避免这种情况,请通过将以下参数包含到proxy_cache_path伪指令来配置缓存的迭代加载:

    • loader_threshold - 迭代的持续时间,以毫秒为单位(默认为200)
    • loader_files - 在一次迭代期间加载的最大项目数(默认为100)
    • loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为50)

在以下示例中,迭代持续300毫秒或直到加载了200个项目:

  1. proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
 

4. 指定要缓存的请求

默认情况下,NGINX首次从代理服务器接收到这样的响应后,缓存对HTTP GETHEAD方法的请求的所有响应。 作为请求的密钥(标识符),NGINX使用请求字符串。 如果请求具有与缓存响应相同的密钥,则NGINX将缓存的响应发送给客户端。 您可以在httpserver, 或 location上下文中包含各种指令,以控制哪些响应被缓存。

要更改在计算密钥时使用的请求字符,请包括proxy_cache_key伪指令:

  1. proxy_cache_key "$host$request_uri$cookie_user";
 

要定义在缓存响应之前必须进行具有相同密钥的请求的最小次数,请包括proxy_cache_min_uses指令:

  1. proxy_cache_min_uses 5;
 

要使用除GET和HEAD之外的方法来缓存对请求的响应,请将它们与GET和HEAD一起列为proxy_cache_methods伪指令的参数:

  1. proxy_cache_methods GET HEAD POST;
 

5. 限制或绕过缓存

默认情况下,响应将无限期地保留在缓存中。 只有缓存超过最大配置大小,然后按照最后一次请求的时间长度,它们才被删除。 您可以通过在httpserver, 或 location上下文中包含指令来设置缓存响应被认为有效的时间长度,甚至是否使用它们。

要限制缓存响应与特定状态代码被认为有效的时间,请包括proxy_cache_valid指令:

  1. proxy_cache_valid 200 302 10m;
  2. proxy_cache_valid 404 1m;
 

在此示例中,使用代码200302的响应有效时间为10分钟,并且代码404的响应有效1分钟。 要定义具有所有状态代码的响应的有效时间,请指定any作为第一个参数:

  1. proxy_cache_valid any 5m;
 

要定义NGINX不会向客户端发送缓存响应的条件,请包括proxy_cache_bypass指令。 每个参数定义一个条件并由多个变量组成。 如果至少有一个参数不为空,并且不等于“0”(零),则NGINX不会在缓存中查找响应,而是将请求立即转发到后端服务器。

  1. proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
 

要定义NGINX根本不缓存响应的条件,请包括proxy_no_cache指令,以与proxy_cache_bypass伪指令相同的方式定义参数。

  1. proxy_no_cache $http_pragma $http_authorization;
 

6. 从缓存中清除内容

NGINX可以从缓存中删除过期的缓存文件。删除过期的缓存内容以防止同时提供旧版本和新版本的网页。 在接收到包含自定义HTTP头或“PURGE” HTTP方法的特殊“purge”请求时,缓存被清除。

6.1 配置缓存清除

我们设置一个配置来标识使用“PURGE” HTTP方法的请求并删除匹配的URL。

  1. http块层级上,创建一个新变量,例如:$purge_method,这将取决于$request_method变量:
  1. http {
  2. ...
  3. map $request_method $purge_method {
  4. PURGE 1;
  5. default 0;
  6. }
  7. }
 
  1. location中配置高速缓存,包括指定缓存清除请求的条件的proxy_cache_purge指令。 在我们的例子中,它是在上一步配置的$purge_method

    1. server {
    2. listen 80;
    3. server_name www.example.com;
    4. location / {
    5. proxy_pass http://localhost:8002;
    6. proxy_cache mycache;
    7. proxy_cache_purge $purge_method;
    8. }
    9. }
     

    6.3 发送清除命令

配置proxy_cache_purge指令后,您需要发送一个特殊的缓存清除请求来清除缓存。 您可以使用一系列工具发出清除请求,例如curl命令:

  1. $ curl -X PURGE -D "http://www.example.com/*"
  2. HTTP/1.1 204 No Content
  3. Server: nginx/1.5.7
  4. Date: Sat, 01 Dec 2015 16:33:04 GMT
  5. Connection: keep-alive
 

在该示例中,具有公共URL部分(由星号通配符指定)的资源将被删除。 但是,这些高速缓存条目将不会从缓存中完全删除:它们将保留在磁盘上,直到它们被删除为非活动状态(proxy_cache_path的非活动参数),或由缓存清除程序进程处理,或客户端尝试访问它们 。

6.4 限制访问清除命令

建议您配置允许发送缓存清除请求的有限数量的IP地址:

  1. geo $purge_allowed {
  2. default 0; # deny from other
  3. 10.0.0.1 1; # allow from localhost
  4. 192.168.0.0/24 1; # allow from 10.0.0.0/24
  5. }
  6. map $request_method $purge_method {
  7. PURGE $purge_allowed;
  8. default 0;
  9. }
 

在这个例子中,NGINX检查请求中是否使用“PURGE”方法,如果是,分析客户端IP地址。 如果IP地址被列入白名单,那么$purge_method设置为$purge_allowed:“1”允许清除,“0”表示清除。

6.5 从缓存中完全删除文件

要完全删除与星号相匹配的缓存文件,您将需要激活一个特殊的缓存清除程序,该过程将永久地遍历所有缓存条目,并删除与通配符相匹配的条目。 在http块级别上,将purger参数添加到proxy_cache_path指令中:

  1. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
 

6.6 缓存清除配置示例

  1. http {
  2. ...
  3. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
  4. map $request_method $purge_method {
  5. PURGE 1;
  6. default 0;
  7. }
  8. server {
  9. listen 80;
  10. server_name www.example.com;
  11. location / {
  12. proxy_pass http://localhost:8002;
  13. proxy_cache mycache;
  14. proxy_cache_purge $purge_method;
  15. }
  16. }
  17. geo $purge_allowed {
  18. default 0;
  19. 10.0.0.1 1;
  20. 192.168.0.0/24 1;
  21. }
  22. map $request_method $purge_method {
  23. PURGE $purge_allowed;
  24. default 0;
  25. }
  26. }
 

7. 字节缓存

有时,初始缓存填充操作可能需要一些时间,特别是对于大文件。 当第一个请求开始下载视频文件的一部分时,下一个请求将不得不等待整个文件被下载并放入高速缓存。

NGINX使缓存这样的范围请求成为可能,并逐渐用缓存片模块填充高速缓存。 该文件分为较小的“切片”。 每个范围请求选择将覆盖所请求范围的特定切片,并且如果此范围仍未缓存,请将其放入缓存中。 对这些切片的所有其他请求将从缓存中获取响应。

要启用字节范围缓存:

  1. 确保您的NGINX是使用slice模块编译的。

  2. 使用slice指令指定切片的大小:

    1. location / {
    2. slice 1m;
    3. }
    Shell

    slice的大小应适当调整,使切片快速下载。 在处理请求时,太小的大小可能会导致内存使用量过多和大量打开的文件描述符,太大的值可能会导致延迟。

  3. $slice_range变量包含到缓存键中:

  1. proxy_cache_key $uri$is_args$args$slice_range;
 
  1. 启用使用206状态代码缓存响应:

    1. proxy_cache_valid 200 206 1h;
    Shell
  2. 通过在Range头字段中传递$slice_range变量来将传递范围请求设置为代理服务器:

  1. proxy_set_header Range $slice_range;
 

字节范围缓存示例:

  1. location / {
  2. slice 1m;
  3. proxy_cache cache;
  4. proxy_cache_key $uri$is_args$args$slice_range;
  5. proxy_set_header Range $slice_range;
  6. proxy_cache_valid 200 206 1h;
  7. proxy_pass http://localhost:8000;
  8. }
 

请注意,如果切片(slice)缓存打开,则不应更改初始文件。

8. 组合配置示例

以下示例配置组合了上述某些缓存选项。

  1. http {
  2. ...
  3. proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300
  4. loader_files=200 max_size=200m;
  5. server {
  6. listen 8080;
  7. proxy_cache one;
  8. location / {
  9. proxy_pass http://backend1;
  10. }
  11. location /some/path {
  12. proxy_pass http://backend2;
  13. proxy_cache_valid any 1m;
  14. proxy_cache_min_uses 3;
  15. proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
  16. }
  17. }
  18. }
 

在这个例子中,两个位置使用相同的缓存,但是以不同的方式。

由于backend1服务器的响应很少更改,因此不包括缓存控制指令。 首次请求响应缓存,并无限期保持有效。

相比之下,对backend2服务的请求的响应频繁变化,因此它们被认为只有1分钟有效,并且在相同请求3次之前不被缓存。 此外,如果请求符合proxy_cache_bypass指令定义的条件,则NGINX会立即将请求传递给backend2,而不在缓存中查找。

Nginx内容缓存的更多相关文章

  1. Nginx content cache Nginx内容缓存

    原文地址:http://nginx.com/resources/admin-guide/caching/ Nginx content cache Nginx内容缓存 This chapter desc ...

  2. nginx本地缓存

    Nginx 作为Web服务器或者负载均衡器,一般不执行业务逻辑,而是将请求转到后端服务器,比如 Tomcat 或者 php-fpm,后端处理完毕之后将经过 nginx 将数据返回给用户.在请求转发的过 ...

  3. Varnish,Nginx搭建缓存服务器

    Varnish,Nginx搭建缓存服务器 一. varnish 1.安装pcre库,兼容正则表达式 # tar -zxvf pcre-8.10.tar.gz # cd pcre-8.10 # ./co ...

  4. nginx代理缓存

    (1)缓存介绍 1.代理服务器端缓存作用 减少后端压力,提高网站并发延时 2.缓存常见类型 服务器端缓存:代理缓存,获取服务器端内容进行缓存 浏览器端缓存 3.nginx代理缓存:proxy_cach ...

  5. nginx proxy_cache缓存详解

    目录 1. 关于缓冲区指令 1.1 proxy_buffer_size 1.2 proxy_buffering 1.3 proxy_buffers 1.4 proxy_busy_buffers_siz ...

  6. Nginx做缓存服务器

    Nginx做缓存服务器 Nginx配置 1.主配置/etc/nginx/nginx.conf worker_processes 1; events { worker_connections 1024; ...

  7. Nginx代理缓存功能

    Nginx代理缓存功能      Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...

  8. Nginx作为缓存服务

    缓存类型 (1) 服务器缓存 服务端缓存一般使用Memcache.Redis (2)代理缓存 (3)客户端缓存 代理缓存流程图 第一步:客户端第一次向Nginx请求数据a: 第二步:当Nginx发现缓 ...

  9. 12、Nginx代理缓存服务

    通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提高网站并发延时 1.缓存常见类型 服务端缓存 代理缓存, 获取服务端内容进行缓存 客户端浏览器缓存 Nginx代理缓存原理 ...

随机推荐

  1. HDU Virtual Friends(超级经典的带权并查集)

    Virtual Friends Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. Vue学习—Vue写一个图片轮播组件

    1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内 ...

  3. jQuery 表单元素取值与赋值方法总结

    一.普通文本框的赋值与取值 1.1.1赋值 <h2>jQuery 表单元素取值与赋值方法总结</h2> <input type="text" clas ...

  4. 原生js创建模态框

    1.效果图如下: 2.代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  5. 进程通信-Queue

    进程通信-Queue Queue消息队列是python进程通信的其中一种方式.需要引入multiprocessing包中的Queue函数(这是函数,不是类). 有一个queue包,里面也有Queue, ...

  6. 将变量做为一个对象的key,push新增进一个数组

    var orgnIdListValue=["0","2"]; function arrayField(a,b){ let arrayMes=[]; for(va ...

  7. ElasticSearch优化系列一:集群节点规划

    节点职责单一,各司其职 elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: ...

  8. Delphi无边框Form拖动

    用Delphi做登陆窗口,如果使用无边框Form,想要拖动窗口,可以在某个控件的OnMouseDown事件中写下以下代码 ReleaseCapture; Perform(WM_SYSCOMMAND, ...

  9. u-boot-1.1.6第1阶段分析之start.S、lowlevel_init.S文件

    学习目标: 对start.S中每一行代码,都有基本了解 通过对start.S文件分析,对ARM920T架构的CPU的启动过程,有更清楚理解 U-boot属于两个阶段的Bootloader,第一阶段的文 ...

  10. SparkStreaming任务保持运行,定时任务监控进程,保证不挂掉

    cron任务:每隔1分钟启动脚本,检查进程是否运行.crontab -e */1 * * * * bash /data/spark/test.sh 检查进程,如果进程挂掉,重新启动Spark任务:给s ...