# 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;
}
}