{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
缓存启用时,nginx保存响应到磁盘缓存,客户端每次请求相同内容时无需代理请求,直接使用缓存内容响应客户端。
为了启用缓存,在http上下文中设置proxy_cache_path指令。第一个必选参数是缓存内容的本地文件系统路径,必选参数keys_zone定义用于存储缓存条目的元数据的共享内存区域的名称和大小:
http{#...proxy_cache_path/data/nginx/cachekeys_zone=one:10m;}
然后在你想要缓存服务器响应的上下文(协议类型、虚拟主机或location)中使用proxy_cache指令,指定proxy_cache_path指令的keys_zone参数定义的区域名称(在这种情况下,是one):
http{#...proxy_cache_path/data/nginx/cachekeys_zone=one:10m;server{proxy_cacheone;location/{proxy_passhttp://localhost:8000;}}}
注意,keys_zone参数定义的大小不限制缓存响应数据的总大小。缓存的响应本身存储在文件系统中特定文件的元数据副本中。使用proxy_cache_path指令的max_size参数限制缓存响应数据的总大小。(但是注意,缓存数据的总大小可以临时超过这个限制。)
有两个额外nginx进程涉及缓存:
在下面例子中,每次迭代加载至少300毫秒或至少加载200个项目:
proxy_cache_path/data/nginx/cachekeys_zone=one:10mloader_threshold=300loader_files=200;4指定哪些请求被缓存
默认,nginx缓存所有第一次使用httpget和head方法的请求的响应,响应接收自代理服务器。nginx使用请求字符串作为请求的缓存键。如果请求与缓存的响应有相同的缓存键,nginx发送缓存响应到客户端。可以在http、server或location上下文中包括各种指令控制那些响应被缓存。
使用proxy_cache_key指令修改缓存键的计算方式:
proxy_cache_key"$host$request_uri$cookie_user";
使用proxy_cache_min_uses指令定义请求使用相同缓存键至少多少次后响应才被缓存:
proxy_cache_min_uses5;
使用proxy_cache_methods指令缓存get和head之外的请求的响应:
proxy_cache_methodsgetheadpost;5限制或禁用缓存
默认,响应无限期的保存在响应中。只有当超过配置的最大大小时,才会按最后请求的时间远近顺序删除。可以设置缓存响应多久失效,甚至是否它们一直使用。
使用proxy_cache_valid指令限制特定状态码响应的有效时间:
proxy_cache_valid20030210m;proxy_cache_valid4041m;
在上面例子中,状态码为200或302的响应有效期是10分钟,状态码为404的响应有效期是1分钟。为了定义所有响应的有效期使用any作为第一个参数:
proxy_cache_validany5m;
使用proxy_cache_bypass指令定义nginx不发送缓存响应到客户端的条件。每个参数定义一个条件,由大量变量组成。如果至少一个参数不为空并且不等于“0”,nginx就不在缓存中查找响应,而是立即将请求转发到后端服务器。
proxy_cache_bypass$cookie_nocache$arg_nocache$arg_comment;
使用proxy_no_cache指令定义nginx不缓存响应的条件。与proxy_cache_bypass参数相同。
proxy_no_cache$http_pragma$http_authorization;6清理缓存内容
nginx可以清理过期缓存文件。为了防止同时服务新老版本的web页面,非常有必要清理过期缓存内容。当接收到特定包含自定义http头或httppurge方法的“purge”请求时,nginx清理过期的缓存。
下面例子配置,使用purgehttp方法标识请求并删除匹配的uri。
http{#...map$request_method$purge_method{purge1;default0;}}在location块中配置了缓存,使用proxy_cache_purge指令指定清理缓存请求的条件。在我们的例子中,使用上一步配置的$purge_method:
server{listen80;server_namewww.example.com;location/{proxy_passhttps://localhost:8002;proxy_cachemycache;proxy_cache_purge$purge_method;}}6.2发送清理命令
当proxy_cache_purge指令被配置时,可以发送一条特定的缓存清理请求清理缓存。有一系列的发送请求工具,例如,curl命令:
$curl-xpurge-d–"https://www.example.com/*"http/1.1204nocontentserver:nginx/1.5.7date:sat,01dec201516:33:04gmtconnection:keep-alive
在例子中,有一个公共url部分(通过星号通配符指定)的资源备清理。然而,这些缓存条目不会完全从缓存中删除:它们会保留在磁盘上,直到它们不活跃(通过proxy_cache_path指令的inactive参数决定)或清理缓存(使用proxy_cache_path指令的purger参数启用),或客户端尝试访问它们时删除。
推荐限制允许发送清理缓存请求的ip地址的数量:
geo$purge_allowed{default0;#拒绝其他ip地址10.0.0.11;#允许从10.0.0.1访问192.168.0.0/241;#允许从192.168.0.0/24访问}map$request_method$purge_method{purge$purge_allowed;default0;}
在该例子中,nginx检查该请求是否是“purge”方法,如果是,分析客户端的ip地址。如果ip地址是白名单,那么$purge_method设置$purge_allowed为:1,允许清理,0,拒绝清理。
为了完全删除匹配星号的缓存文件,激活特定缓存清理进程,永久编译所有缓存条目并删除匹配通配符的条目。包括purger参数到http上下文的proxy_cache_path指令:
proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=mycache:10mpurger=on;6.5清理缓存配置示例
http{#...proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=mycache:10mpurger=on;map$request_method$purge_method{purge1;default0;}server{listen80;server_namewww.example.com;location/{proxy_passhttps://localhost:8002;proxy_cachemycache;proxy_cache_purge$purge_method;}}geo$purge_allowed{default0;10.0.0.11;192.168.0.0/241;}map$request_method$purge_method{purge$purge_allowed;default0;}}7字节范围缓存
最初的缓存填充操作有时可能需要一些时间,尤其对于大文件。例如,当一个视频文件开始下载到完成文件一部分的初始请求,后续请求必须等待整个文件被下载并放入缓存。
nginx可以缓存范围请求,使用cacheslice模块逐步填充缓存,切分文件到更小的“片段”。每个范围请求选择特定片段,如果该范围没有缓存,放入缓存中。这些片段的其它请求直接从缓存获取数据。
为了启用字节范围缓存:
location/{slice1m;}
选择一个能足够快下载分片的分片大小。太小可能导致浪费过多的内存,并且处理请求时要打开大量的文件描述符,而值太大会导致延迟。
proxy_cache_key$uri$is_args$args$slice_range;启用状态码为206的响应的缓存:
proxy_cache_valid2002061h;启用传入范围请求到代理服务器通过传入$slice_range变量到range头字段:
proxy_set_headerrange$slice_range;
二进制范围缓存例子:
location/{slice1m;proxy_cachecache;proxy_cache_key$uri$is_args$args$slice_range;proxy_set_headerrange$slice_range;proxy_cache_valid2002061h;proxy_passhttp://localhost:8000;}
注意,如果分片缓存打开,最初的文件不会改变。
http{#...proxy_cache_path/data/nginx/cachekeys_zone=one:10mloader_threshold=300loader_files=200max_size=200m;server{listen8080;proxy_cacheone;location/{proxy_passhttp://backend1;}location/some/path{proxy_passhttp://backend2;proxy_cache_validany1m;proxy_cache_min_uses3;proxy_cache_bypass$cookie_nocache$arg_nocache$arg_comment;}}}
在该例子中,两个location使用相同的缓存,但方式不同。
因为来自backend1服务器的响应很少改变,没有缓存控制指令。第一次响应缓存的请求,并永久保存。