Nginx缓存设置详解
Nginx缓存设置详解
本文将详细介绍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-age
,max-age
的值通常以秒为单位的数字,如:
add_header Cache-Control "public, max-age=120"; # 设置120秒的缓存
但是如下值有特殊含义:
-1
或off
:关闭缓存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;
}
}
参考文档
- HTTP缓存
- Nginx添加header
