乐闻世界logo
搜索文章和话题

Nginx 如何实现缓存?如何配置缓存策略?

2月21日 16:57

Nginx 如何实现缓存?如何配置缓存策略?

Nginx 提供了强大的缓存功能,可以缓存后端服务器的响应,减轻后端负载,提高响应速度。Nginx 支持代理缓存和 FastCGI 缓存等多种缓存方式。

代理缓存配置:

nginx
http { # 定义缓存路径和参数 proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off; server { listen 80; server_name example.com; location / { proxy_cache proxy_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_bypass $http_cache_control; add_header X-Cache-Status $upstream_cache_status; proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }

缓存参数说明:

  1. proxy_cache_path:定义缓存存储路径和参数

    • levels:缓存目录层级结构
    • keys_zone:共享内存区域名称和大小
    • max_size:缓存最大大小
    • inactive:缓存项不活动时间
    • use_temp_path:是否使用临时路径
  2. proxy_cache:指定使用的缓存区域

  3. proxy_cache_valid:设置不同状态码的缓存时间

    • 200 302 10m:200 和 302 状态码缓存 10 分钟
    • 404 1m:404 状态码缓存 1 分钟
  4. proxy_cache_key:定义缓存键

  5. proxy_cache_bypass:绕过缓存的条件

FastCGI 缓存配置:

nginx
http { fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgi_cache:10m max_size=1g inactive=60m; server { listen 80; server_name example.com; location ~ \.php$ { fastcgi_cache fastcgi_cache; fastcgi_cache_valid 200 60m; fastcgi_cache_methods GET HEAD; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; add_header X-Cache-Status $upstream_cache_status; fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } }

缓存清除:

Nginx 开源版本不支持主动缓存清除,可以通过以下方式实现:

  1. 设置缓存过期时间:通过 proxy_cache_valid 控制
  2. 使用第三方模块:如 ngx_cache_purge
  3. 手动删除缓存文件:根据缓存键删除对应文件

缓存策略配置:

nginx
# 根据请求方法缓存 proxy_cache_methods GET HEAD; # 根据响应头缓存 proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; # 缓存最小请求次数 proxy_cache_min_uses 2; # 缓存锁定,防止缓存风暴 proxy_cache_lock on; proxy_cache_lock_timeout 5s; # 缓存背景更新 proxy_cache_background_update on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

动态缓存控制:

nginx
# 根据条件决定是否缓存 map $request_uri $skip_cache { default 0; ~*/admin/ 1; ~*/api/ 1; } # 根据响应头决定是否缓存 map $upstream_http_cache_control $skip_cache { ~*no-cache 1; ~*private 1; default 0; }

静态文件缓存:

nginx
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; }

缓存状态监控:

nginx
add_header X-Cache-Status $upstream_cache_status; # 缓存状态值: # MISS - 未命中缓存 # BYPASS - 绕过缓存 # EXPIRED - 缓存过期 # STALE - 使用过期缓存 # UPDATING - 缓存更新中 # HIT - 命中缓存

缓存优化建议:

  1. 合理设置缓存时间,平衡新鲜度和性能
  2. 使用缓存键包含必要参数,避免缓存冲突
  3. 对动态内容禁用缓存
  4. 定期清理过期缓存
  5. 监控缓存命中率,调整缓存策略
  6. 使用缓存锁定防止缓存风暴
  7. 对静态资源使用浏览器缓存

完整配置示例:

nginx
http { # 代理缓存 proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=proxy_cache:100m max_size=10g inactive=60m use_temp_path=off; # FastCGI 缓存 fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgi_cache:100m max_size=10g inactive=60m; # 缓存跳过条件 map $request_uri $skip_cache { default 0; ~*/admin/ 1; ~*/api/ 1; ~*/user/ 1; } server { listen 80; server_name example.com; # 静态文件 location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; } # 动态内容代理 location / { proxy_cache proxy_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_bypass $skip_cache; proxy_no_cache $skip_cache; add_header X-Cache-Status $upstream_cache_status; proxy_pass http://backend; } # PHP 文件 location ~ \.php$ { fastcgi_cache fastcgi_cache; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; add_header X-Cache-Status $upstream_cache_status; fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; } } }
标签:Nginx