Skip to content

缓存机制

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-ControlExpires 响应头,控制浏览器缓存行为:

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_pathproxy_cache_valid 等配置项管理缓存目录、缓存大小和缓存时间。
  • 代理缓存管理:可以通过条件跳过缓存、不同状态码设置不同缓存时间来灵活管理缓存策略。
  • 缓存清理和控制过期:通过 inactive 参数自动清除过期缓存,或手动清理缓存文件,并通过响应头控制浏览器缓存行为。

通过适当的缓存配置和管理,Nginx 能够显著减少服务器负载,提升应用的性能和响应速度。

编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!