模式切换
缓存机制
Nginx 缓存机制概述
Nginx 支持缓存加速功能,可以将代理服务器或反向代理的请求结果缓存到本地,从而减少后端服务器的负载,提高网站的响应速度。缓存机制能够极大地提升性能,特别是在处理静态内容(如图片、CSS、JS 文件)时,Nginx 能够高效地处理这些资源,并将它们缓存供重复请求使用。
Nginx 缓存的两种方式
- 代理缓存(Proxy Cache):对从后端服务器获取的响应进行缓存,适用于动态内容的加速。
- 静态文件缓存(FastCGI Cache):专门为 FastCGI 生成的响应(如 PHP 文件)缓存,减少每次请求对后端应用的压力。
Nginx 缓存配置
缓存的核心配置包含缓存路径和缓存有效期,缓存的数据会存储在指定的本地磁盘目录中。
配置缓存路径
在 Nginx 配置文件中,首先要设置缓存存储的目录及缓存大小限制。
nginx
http {
# 定义缓存路径
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
}
/var/cache/nginx
:缓存数据存储的路径。levels=1:2
:缓存文件目录结构,分为两级(提高检索效率)。keys_zone=my_cache:10m
:定义缓存区域my_cache
,大小为 10MB,用于存储缓存的元数据(如 URL 和响应头)。inactive=60m
:缓存对象在 60 分钟内没有被访问将被移除。max_size=1g
:设置缓存的最大大小为 1GB。
配置代理缓存
在缓存路径定义完成后,我们可以为指定的代理服务器或反向代理配置缓存。
nginx
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache; # 启用缓存
proxy_pass http://backend_server; # 后端服务器
proxy_cache_valid 200 302 10m; # 对 HTTP 状态码 200 和 302 响应,缓存时间 10 分钟
proxy_cache_valid 404 1m; # 对 404 响应,缓存 1 分钟
proxy_cache_bypass $cookie_nocache $arg_nocache; # 如果指定条件为真,则跳过缓存
add_header X-Cache-Status $upstream_cache_status; # 添加自定义响应头,显示缓存状态
}
}
proxy_cache my_cache
:指定要使用的缓存区域。proxy_pass
:将请求转发到后端服务器。proxy_cache_valid
:为指定的 HTTP 响应状态码设置缓存时间。proxy_cache_bypass
:通过条件决定是否绕过缓存(如通过 cookie 或 URL 参数)。
配置静态文件缓存
对于静态资源文件(如图片、CSS、JS 文件),可以单独配置缓存:
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 设置静态文件缓存有效期为 30 天
add_header Cache-Control "public";
}
expires
:设置资源的过期时间。add_header Cache-Control
:为响应添加Cache-Control
头,表明资源可被缓存。
设置和管理代理缓存
管理缓存的重点在于合理设置缓存的策略,以便应对不同的场景需求。以下是一些常用的缓存管理技术:
跳过特定请求的缓存
通过特定的条件跳过缓存,例如基于 cookie 或 URL 参数:
nginx
location / {
proxy_cache_bypass $cookie_session $arg_nocache; # 如果存在 cookie 或 URL 参数,则不缓存
}
$cookie_session
:检测用户是否携带某个 session cookie。$arg_nocache
:检查 URL 参数是否携带特定字段。
设置缓存的不同有效期
根据返回的 HTTP 状态码或者内容类型,设置不同的缓存有效期。例如,成功的响应可以缓存更长时间,404 错误可以短时间缓存:
nginx
proxy_cache_valid 200 302 10m; # 成功的响应缓存10分钟
proxy_cache_valid 404 1m; # 404 响应缓存1分钟
proxy_cache_valid
:定义特定 HTTP 状态码的缓存时间。
缓存更新策略
当需要更新缓存时,可以通过设置 proxy_cache_revalidate
来实现缓存的更新:
nginx
proxy_cache_revalidate on; # 缓存过期时,发送条件请求以检查缓存是否需要更新
控制缓存的大小
通过 max_size
参数来限制缓存的总大小。达到大小限制后,Nginx 会自动删除最旧的缓存文件。
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=2g;
缓存清理和控制缓存过期
有时需要手动清理缓存或者控制缓存的过期时间。Nginx 缓存可以通过以下方式进行管理:
手动清理缓存
Nginx 没有内置的命令来清理缓存文件,可以通过手动删除缓存目录下的文件来清除缓存:
bash
sudo rm -rf /var/cache/nginx/* # 清除所有缓存文件
注意:清理缓存时要小心操作,删除操作会立即使所有缓存失效。
缓存过期控制
通过 inactive
参数来控制缓存文件的过期时间。inactive
是指在这段时间内没有被访问的缓存数据会被自动清除。
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=30m;
inactive=30m
:缓存文件在 30 分钟内如果未被访问,将被移除。
响应头中的缓存控制
通过向客户端发送 Cache-Control
或 Expires
响应头,控制浏览器缓存行为:
nginx
location / {
add_header Cache-Control "no-cache, no-store, must-revalidate"; # 不允许缓存
add_header Pragma "no-cache"; # 向旧版浏览器发送 no-cache 指令
expires off; # 禁用 Nginx 缓存
}
总结
- 缓存机制:Nginx 支持代理缓存和静态文件缓存,能够极大提高请求的响应速度。
- 缓存配置:通过
proxy_cache_path
、proxy_cache_valid
等配置项管理缓存目录、缓存大小和缓存时间。 - 代理缓存管理:可以通过条件跳过缓存、不同状态码设置不同缓存时间来灵活管理缓存策略。
- 缓存清理和控制过期:通过
inactive
参数自动清除过期缓存,或手动清理缓存文件,并通过响应头控制浏览器缓存行为。
通过适当的缓存配置和管理,Nginx 能够显著减少服务器负载,提升应用的性能和响应速度。