码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx 配置页面缓存

时间:2018-04-15 22:54:29      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:cache   存在   比较   ida   zone   bytes   算法   not   包含   

Web 缓存是指一个 Web 资源(HTML 页面、JS、图片以及数据等)存在于 Web 服务器和客户端(浏览器)之间(此处即是代理服务器)的副本。

缓存会根据客户端的请求保存响应的副本,当下一个请求到来时,若是相同的 URL,那么缓存会根据缓存机制来决定是直接使用副本响应请求,还是向源服务器再次发送请求。

比较常见的就是浏览器会缓存访问过的网页,当再次访问这个 URL 的时候,若网页没有更新,那么不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会重新下载网页。

配置页面缓存

Nginx 中页面缓存的配置如下所示:

http {
    ...
    proxy_cache_path /www/nginx/ng/cache/webservers levels=1:2 keys_zone=webservers:20m max_size=1g;
    proxy_cache_key "$host$request_uri";
    
    server {
        ...
        add_header X-Via $server_addr;
        add_header X-Cache $upstream_cache_status;
        
        location / {
            proxy_pass http://webservers;
            proxy_set_header  X-Real-IP  $remote_addr;

            proxy_cache webservers;
            proxy_cache_valid 200 10m;
        }
    }
    
    upstream webservers {
        server 192.168.0.214 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.0.22 weight=1 max_fails=2 fail_timeout=2;
    }
}
  • proxy_cache_path 指令(http 上下文),指定缓存的路径和参数。

    levels 参数,指定多级目录结构(最多三级目录,每级目录的名字最多为 2 个字符)。1:2 表示创建两级目录,第一级目录名取 proxy_cache_key MD5 值的最后一个字符,第二级目录名取倒数 2-3 字符。如下所示:

    /www/nginx/ng/cache/webservers/c/b3/887f906f2c6e20eb22bbe45294a1cb3c

    keys_zone 参数,指定缓存区域的名称及缓存的大小。名称用于 proxy_cache 指令设置缓存放置的位置。

    max_size 参数,指定缓存的最大值,若缓存大小超过此值,那么最少使用数据(通过 LRU 替换算法)将被删除。

  • proxy_cache_key 指令(http、server 或 location 上下文),设置以何种参数的 MD5 值得到缓存的文件名。

    此处以主机名、请求 URI(包含参数)字符串的 MD5 值作为缓存的文件名。

    默认是 $scheme$proxy_host$request_uri。

  • proxy_cache 指令(http、server 或 location 上下文),指定一个缓存区域或使用 off(不缓存,默认)。

    当放置在 location 上下文中时,匹配此 location 的 URL 才会被缓存。

  • proxy_cache_valid 指令(http、server 或 location 上下文),设置 HTTP 状态码的缓存时间。

    若只设置时间,那么只会为 200、301 以及 302 的响应进行缓存。

    使用 any 参数则会为所有响应进行缓存。

  • X-Via 首部,设置代理服务器的地址。

    $server_addr 表示服务器的的地址,通过一次系统调用可确定此值。

    若要绕开系统调用,则需在 listen 指令中指定地址并且使用 bind 参数。

    listen 127.0.0.1:8000;

  • X-Cache 首部,设置缓存的命中状态。

    $upstream_cache_status 表示代理的缓存命中状态,其值可能为:

    MISS,未命中。响应在缓存中未找到,需在服务器中获取,然后可能会被缓存。

    HIT,命中。响应包含来自缓存的最新内容。

    EXPIRED,缓存中的某项过期,来自原始服务器的响应将包含最新的内容。

    UPDATING,内容过期,因为相对于之前的请求,响应的入口已经更新,并且 proxy_cache_use_stale 的 updating 已被设置。

    STALE,内容陈旧的原因是原始服务器不能正确响应,需配置 proxy_cache_use_stale。

    BYPASS,由于请求匹配了一个 proxy_cache_bypass,响应将来自原始服务器而非缓存。该响应之后可能会被缓存。

    REVALIDATED,使用了 proxy_cache_revalidate 指令,Nginx 检测得知当前的缓存内容依然有效(If-Modified-Since 或 If-None-Match)。

缓存命中

设置页面缓存后,第一次请求返回的响应首部如下:

HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sat, 24 Feb 2018 16:51:09 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 23
Connection: keep-alive
Last-Modified: Sat, 24 Feb 2018 06:40:12 GMT
ETag: "5a9108cc-17"
X-Via: 192.168.0.99
X-Cache: MISS
Accept-Ranges: bytes

第一次访问,通过 X-Cache 首部可看到缓存未命中。

后续请求(直到缓存失效之前)返回的响应首部如下:

HTTP/1.1 304 Not Modified
Server: nginx/1.12.2
Date: Sat, 24 Feb 2018 16:51:35 GMT
Connection: keep-alive
Last-Modified: Sat, 24 Feb 2018 06:40:12 GMT
ETag: "5a9108cc-17"
X-Via: 192.168.0.99
X-Cache: HIT

后续访问,通过 X-Cache 首部可看到缓存命中。

Nginx 配置页面缓存

标签:cache   存在   比较   ida   zone   bytes   算法   not   包含   

原文地址:https://www.cnblogs.com/reghao/p/8849730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!