# nginx 缓存设置

# nginx 是什么

Nginx是异步非阻塞框架的web服务器,可以用作反向代理、负载平衡器、缓存服务器。 该软件由俄罗斯程序员伊戈尔·赛索耶夫开发并于2004年首次公开发布。2011年成立同名公司以提供支持服务。

# 什么是http缓存

web开发中,http缓存是指充分利用浏览器(和CDN)的特性对于已下载的资源进行复用(从内存、磁盘中直接读取,而非重新发送网络请求),从而显著的提升网络加载速度。

浏览器都具有缓存能力,尤其对于静态资源文件,在刷新页面的时候都会优先从缓存中读取。如下图,浏览器控制台,使用本地缓存的请求往往都能在数毫秒内完成,从而在提升网站加载速度的同时减轻服务器的负载。

生产开发中,客户端缓存(浏览器)仅是我们要面对的缓存之一,另外一种就是CDN缓存,CDN是利用全国(全球)大量节点提供快速、稳定、安全的内容分发加速服务, 通过提前缓存资源,利用用户最近节点提供下载服务,从而加速客户访问速度(顺便降低服务器压力)。

Cache-Control 是一个http响应头字段, 通过该响应头可以告诉浏览器、CDN指定的资源是否可以缓存、缓存多久。

# 如何在 NGINX 中使用缓存控制

Cache-Control的可选值

  1. public 公开信息,可以被浏览器+CDN进行缓存,适用于大部分静态资源
  2. private 包含CDN不应该缓存的信息,但是浏览器可以缓存,一般为和用户相关的数据
  3. no-cache 名称具有一定的误导性,no-cache并不表示🈲缓存,而是协商缓存,既需要和服务器进行内容校验,内容无变更的情况下加载本地缓存(对应304状态码)
  4. no-store 禁止缓存

设置缓存的最大生命周期max-agemax-age的值通常以秒为单位的数字,如:

add_header Cache-Control "public, max-age=120"; # 设置 120 秒的缓存

但是如下值有特殊含义

  1. -1 或off: 关闭缓存
  2. epoch: 设置过期时间为1 January,1970,00:00:01 GMT(🤔设置成这个值有啥意义呢?)
  3. max: the Unix Epoch,2037 年 12 月 31 日 (2038年问题
  4. 30s: 30
  5. 1m: 1分钟
  6. 24h: 24小时
  7. 3d: 3
  8. 1M: 1个月
  9. 2y: 2

此外,还可以添加no-transform指令来禁止可能存在的任何转换,例如,一些CDN服务会压缩图像以减少带宽。该指令禁用该行为。

nginx配置中,可以按如下方式添加Cache-Control头信息:

expires 1y; # 将 max-age 设置为 1 年
add_header Cache-Control "public, no-transform"; # 设置为公开信息,浏览器、CDN 均可缓存,并禁止 CDN 的任何转换

如果将以上配置放到server代码块中可以实现整站缓存配置,但更好的方案是通过文件后缀进行配置:

location ~* .(?:css|js)$ {
  expires 1y;
  add_header Cache-Control "public";
}

以上配置只对cssjs文件设置了缓存。

location /profile {
    expires 2d;
    add_header Cache-Control "public, no-transform";
}

以上配置只对 /profile 以及对应子路径进行缓存配置。

此外还可以使用 = 修饰符,只对指定的路径进行缓存配置。

# Surrogate-Control

上文提到的缓存配置将同时对浏览器、CDN生效,如果需要对CDN单独进行配置,则可通过Surrogate-Control头信息配置, 大多数CDN均支持该头信息。

配置如下:

add_header Surrogate-Control "public, max-age=86400";
add_header Cache-Control "public, max-age=120";

# 服务端缓存

nginx不仅仅可以通过 http 协议来实现客户端缓存,还可以利用 proxy_cache 来实现服务端缓存,避免频繁从上游拉取资源。

# 定义缓存文件路径 和 缓存名称、大小、失效规则
proxy_cache_path ./cache-file-of-nginx levels=1:2 keys_zone=MYAPP:100m inactive=60m;
# 定义缓存的key
proxy_cache_key "$scheme$request_method$host$request_uri";

server {
    ...

    location / {
        proxy_pass http://backend;
        # 使用缓存
        proxy_cache MYAPP;
        proxy_cache_valid 200 302 1m;
        proxy_cache_valid 404 1m;
    }
}

# 参考文档

  1. http 缓存
  2. nginx 添加 header
最后更新: Thu, 01 Feb 2024 14:49:45 GMT

0 评论

加载中...
访问量:-