Nginx 配置页面缓存

Posted reghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 配置页面缓存相关的知识,希望对你有一定的参考价值。

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 配置页面缓存的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 配置页面缓存

nginx缓存静态资源,只需几个配置提升10倍页面加载速度

Nginx——nginx作为静态资源web服务(浏览器缓存示例演示)

Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存

NGINX proxy 模块如何如何缓存动态页面内容?如何让缓存过期

Nginx服务优化之隐藏版本号修改用户与组配置页面缓存与时间日志分割以及设置连接超时