前置缓存-NGINX Content Caching

前言

用户请求的图片,脚本,样式等静态资源的请求对后端服务器造成的压力在高并发的情况下,可能会拖垮你的服务器, 对于这些静态的资源我们把它缓存起来,在用户向服务请求这些静态资源时,前置服务器已经缓存了后端的资源,直接给用户响应, 减少的后端的压力,后端专注与业务,从而不被这些静态资源消耗IO的支出.

概述

在使用缓存的时候, NGINX 把响应保存在磁盘中,并且使用它们应答客户端的连接,不必每次都代理相同的内容

启用响应式缓存

步骤1:将指令 proxy_cache_path 包含在 http{} 中,

强制的第一个参数: 本地文件系统路径

强制的第二个参数: key_zone 参数定义用于存储元数据的内存空间的名称和大小.

max_size: 缓存文件的大小

http{

...

proxy_cache_path/data/nginx/cachekeys_zone=one:10m;

}

将 proxy_cache 指令 放在(protocol type, virtual server 或者 location) 你想缓存响应的地方, 将前面指定的keyzone 的内存名称作为参数给 proxy_cache_path

http{

...

proxy_cache_path/data/nginx/cachekeys_zone=one:10m;

server{

proxy_cachemycache;

location/{

proxy_passhttp://localhost:8000;

}

}}

key-zone 定义的内存大小并不影响缓存数据的总量.

涉及缓存的nginx 进程

cache manager:

定期检查缓存的状态, 如果缓存的大小超出了 max_size ,则会删除最近访问的数据,缓存数据的数量可以临时超过缓存管理器激活之间的时间限制

cache loader:

它仅仅在nginx 启动的时候运行一次,它将加载之前缓存的元数据到共享内存空间, 一次加载大量的缓存缓存数据需要消耗很多的资源, 会在nginx启动的最初几分钟内降低nginx 的性能,

为了避免这种情况, 配置以下的参数到proxy_cache_path 来配置缓存的加载.

loader_threshold: 迭代的时间, 单位毫秒 (默认200)

loader_files :在一次迭代中加载的项目的最大数量 (默认100)

loader_sleeps: 迭代之间的延迟,单位毫秒(默认50)

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

指定要缓存的请求:

默认情况下, NGINX 缓存所有的对HTTP 的GET 和 HEAD 请求进行缓存(在第一次请求代理服务器获取响应的时候)

nginx 使用其你去的字符串作为key, 如果一个请求具有和缓存响应有相同的key, nginx 将缓存响应发送给客户端.

你可以将指令包含在 http{},server{}或者location{} 包含各种指令来缓存响应

proxy_cache_key: 更改key的特性

proxy_cache_key "$host$request_uri$cookie_user";

proxy_cache_min_uses: 同一个请求在缓存开始之前必须执行的最小次数.

proxy_cache_min_uses 5;

proxy_cache_methods: 如果要缓存 GET 和 HEAD 之外的请求, 将GET HEAD 一起作为参数放在该参数后面

proxy_cache_methods GET HEAD POST;

限制或禁用缓存

默认情况下,响应会永远保存在缓存中,只有当缓存超过最大的配置带下, 才会删除它.然后按照最后一次的请求时间长度排序

你可以在http{},server{}, orlocation{}设置缓存的有效时间,甚至是完全使用缓存

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

在这个例子中, 响应状态码是200 或者 302 的时候缓存10秒钟, 响应状态码是400 缓存1秒钟, 如果要缓存所有的状态码, 指定any 作为第一个参数即可

proxy_cache_valid any 5m;

定义nginx 不向客户端发送缓存的条件,在 proxy_cache_bypass 指令中定义, 每个参数定义一个条件, 如果任何一个参数不是空的并且不等于 0 ,nginx 会立即将请求发送的后端服务器.

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

定义nginx 完全不缓存的条件, 在proxy_no_cache 指令中定义和 proxy_cache_bypass 相同的参数即可.

下一章节:

从缓存中清除内容

字节范围的缓存

综合配置示例:

http {

...

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300

loader_files=200 max_size=200m;

server {

listen 8080;

proxy_cache mycache;

location / {

proxy_pass http://backend1;

}

location /some/path {

proxy_pass http://backend2;

proxy_cache_valid any 1m;

}

}}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180615G0Z32100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券