问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Nginx缓存设置详解

创作时间:
作者:
@小白创作中心

Nginx缓存设置详解

引用
1
来源
1.
https://z.wiki/tech/nginx-cache.html

本文将详细介绍Nginx的缓存设置,包括Nginx的基本概念、HTTP缓存的工作原理,以及如何在Nginx中配置缓存控制。文章内容详尽,包含具体的配置示例和解释,适合有一定技术基础的读者学习参考。

Nginx是什么

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

什么是HTTP缓存

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

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

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

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

如何在Nginx中使用缓存控制

Cache-Control的可选值:

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

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

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

但是如下值有特殊含义:

  • -1off:关闭缓存
  • epoch:设置过期时间为1 January,1970,00:00:01 GMT(🤔设置成这个值有啥意义呢?)
  • max:the Unix Epoch,2037年12月31日(2038年问题)
  • 30s:30秒
  • 1m:1分钟
  • 24h:24小时
  • 3d:3天
  • 1M:1个月
  • 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";
}

以上配置只对css、js文件设置了缓存。

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
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号