Nginx的缓存机制主要分为两种:强制缓存(强缓存)和协商缓存(验证缓存)。
强制缓存(强缓存)
强制缓存是指浏览器在请求资源时,直接从本地缓存中读取数据而不向服务器发送任何请求。这种缓存机制主要依赖于HTTP响应头中的Cache-Control
和Expires
字段。
- Expires:指定资源在该时间之前被认为是有效的。例如:
Expires: Wed, 21 Oct 2025 07:28:00 GMT
。但由于Expires
依赖于客户端的时间设置,可能出现非预期的状况。 - Cache-Control:HTTP/1.1引入了更为强大的
Cache-Control
头部,提供了更多控制缓存行为的指令:no-store
:禁止缓存(强缓存和协商缓存),客户端不存储任何值。no-cache
:禁止强缓存,需要重写验证(可以理解为禁止强缓存,启用协商缓存)。private
:私有缓存,禁止中间人(比如CDN等代理缓存)。public
:共享缓存,允许中间人缓存。max-age
:资源可以被缓存的最大时间,单位:秒,是一个相对时间,优先级高于Expires
。s-maxage
:用于共享缓存,单位:秒,如果在其有效期内,不去访问CDN等。s-maxage
会覆盖max-age
和Expires
。must-revalidate
:缓存使用陈旧资源时,必需先验证状态。
协商缓存(验证缓存)
协商缓存是一种在强制缓存失效后使用的缓存机制。在这种情况下,浏览器会携带特定的缓存标识(如ETag
或Last-Modified
)向服务器发送请求,询问资源是否有更新。
- ETag:由服务器生成并返回给客户端的一个唯一标识符,通常基于文件内容的哈希值。每当资源发生变化时,
ETag
也会随之改变。 - Last-Modified:表示资源最后修改时间。例如:
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
。 - If-None-Match:当客户端再次请求资源时,会在请求头中带上之前保存的
ETag
值。 - If-Modified-Since:当客户端再次请求资源时,会在请求头中带上之前保存的
Last-Modified
值。
Nginx配置示例
以下是一个简单的Nginx配置示例,展示了如何为静态资源设置强缓存:
location /static/ { alias /path/to/static/files; expires 30d; add_header Cache-Control "public, max-age=31536000"; }
上述配置将/static/
路径下的文件缓存30天,并且通过Cache-Control
头部设置为公共缓存,允许任何中间人缓存。
调试和优化
- 浏览器开发者工具:在浏览器的开发者工具中,可以查看请求是否使用了缓存(通过状态码200 (from disk cache)或304 not modified)。
- 命令行工具:使用
curl -i http://example.com/resource.js
可以查看请求和响应头信息,帮助调试缓存配置。
通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。在实际应用中,通常会结合使用这两种缓存机制,以达到既快速又可靠的缓存效果。