Nginx 高级缓存配置与优化

一、代理缓存配置 (Proxy Cache)

1. 基础配置模板

nginx 复制代码
http {
    # 定义缓存路径和参数
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m 
                     inactive=60m max_size=1g use_temp_path=off;

    server {
        location / {
            proxy_pass http://backend;
            
            # 启用缓存
            proxy_cache my_cache;
            
            # 缓存有效状态码和时长
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404      1m;
            
            # 缓存键定义(关键参数)
            proxy_cache_key "$scheme$request_method$host$request_uri$arg_user";
            
            # 跳过缓存条件
            proxy_cache_bypass $http_pragma;
            proxy_no_cache $http_authorization;
            
            # 显示缓存状态头(调试用)
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

2. 核心参数解析

  • keys_zone:定义共享内存区(10MB可存储约8,000个键)
  • levels:目录层级结构(推荐 1:2 平衡查找效率)
  • inactive:未访问缓存保留时间(与 max_size 共同作用)
  • max_size:磁盘缓存最大占用空间
  • use_temp_path=off:避免临时文件导致的性能损耗

3. 多场景配置案例

场景1:动静分离缓存

nginx 复制代码
location ~* \.(jpg|png|css|js)$ {
    proxy_cache static_cache;
    proxy_cache_valid 200 7d;
    proxy_cache_lock on;  # 缓存锁防止惊群
    proxy_ignore_headers Set-Cookie; # 忽略后端设置的Cookie
}

location /api/ {
    proxy_cache dynamic_cache;
    proxy_cache_valid 200 5s;  # 动态内容短缓存
    proxy_cache_use_stale updating error timeout;
}

场景2:分设备缓存

nginx 复制代码
map $http_user_agent $device_type {
    ~*mobile  "mobile";
    default   "desktop";
}

proxy_cache_key "$device_type$request_uri";

场景3:缓存排除策略

nginx 复制代码
# 排除POST请求
if ($request_method = POST) {
    set $no_cache 1;
}

# 排除特定URL
location /private/ {
    proxy_no_cache 1;
    proxy_cache_bypass 1;
}

二、浏览器缓存控制

1. 基础配置

nginx 复制代码
location ~* \.(js|css|png|jpg)$ {
    expires 365d;
    add_header Cache-Control "public, no-transform";
    etag on;
}

location /dynamic-content {
    expires -1;
    add_header Cache-Control "no-store, must-revalidate";
}

2. 高级控制策略

指纹资源长期缓存

nginx 复制代码
location ~* \.(?<hash>[a-f0-9]{20})\.(js|css)$ {
    expires max;
    add_header Cache-Control "public, immutable";
}

条件缓存控制

nginx 复制代码
map $http_cookie $cache_zone {
    ~*sessionid  $host-nocache;
    default      $host;
}

Vary头处理

nginx 复制代码
location /compressed/ {
    gzip on;
    add_header Vary Accept-Encoding;
}

三、易错点与解决方案

1. 缓存失效问题

  • 问题现象:内容更新后仍返回旧缓存

  • 解决方案

    nginx 复制代码
    # 添加版本号到缓存键
    proxy_cache_key "$request_uri$http_accept$http_user_agent$arg_v";

2. 内存溢出

  • 问题现象keys_zone内存不足导致503错误

  • 解决方案

    nginx 复制代码
    # 每个key约占用110字节,按需调整
    keys_zone=my_cache:100m;  # 可存储约900,000个键

3. 缓存穿透

  • 问题现象:大量请求绕过缓存直达后端

  • 解决方案

    nginx 复制代码
    proxy_cache_lock on;  # 启用缓存锁
    proxy_cache_background_update on; # 后台更新

4. 磁盘I/O瓶颈

  • 问题现象:高并发时磁盘负载过高

  • 解决方案

    nginx 复制代码
    proxy_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=ram_cache:512m max_size=2g;

四、实战调试技巧

1. 状态监控

bash 复制代码
# 查看缓存内存使用
$ nginx -T 2>&1 | grep keys_zone

# 实时监控缓存状态
$ tail -f /var/log/nginx/access.log | grep X-Cache-Status

2. 缓存清理

nginx 复制代码
# 使用purge模块(需单独编译)
location ~ /purge(/.*) {
    proxy_cache_purge my_cache "$scheme$request_method$host$1";
}

3. 性能调优

nginx 复制代码
# 调整文件描述符
proxy_temp_file_write_size 64k;
open_file_cache max=10000 inactive=30s;

五、场景案例集

案例1:电商网站商品图片

nginx 复制代码
location ~ /products/(.*)\.(jpe?g|png)$ {
    proxy_cache product_images;
    proxy_cache_valid 200 302 30d;
    proxy_cache_use_stale error timeout invalid_header updating;
    expires 30d;
    add_header Cache-Control "public";
}

案例2:实时股票API

nginx 复制代码
location /stock/ {
    proxy_cache_methods GET HEAD;
    proxy_cache_valid 200 10s;
    proxy_cache_lock_timeout 5s;
    add_header X-Cache-Expires $upstream_http_expires;
}

案例3:多CDN回源

nginx 复制代码
proxy_cache_key "$http_x_forwarded_for$request_uri";
proxy_cache_min_uses 3;  # 至少3次请求才缓存

通过合理配置代理缓存和浏览器缓存,结合业务场景进行精细化控制,可实现性能提升50%以上。建议每次配置变更后使用工具(如siegewrk)进行压力测试,并通过$upstream_cache_status监控缓存命中率。

相关推荐
凤凰战士芭比Q42 分钟前
web中间件——Nginx
前端·nginx·中间件
weixin_537765803 小时前
【Nginx优化】性能调优与安全配置
运维·nginx·安全
jzhwolp7 小时前
从nginx角度看数据读写,阻塞和非阻塞
c语言·nginx·性能优化
亮子AI13 小时前
【Nginx】怎样清除 Nginx 的缓存?
运维·nginx·缓存
Fr2ed0m15 小时前
Nginx防御HTTP Host头注入漏洞:实战配置漏洞修复教程
运维·nginx·http
徒 花1 天前
Nginx
运维·nginx·云原生
shumeigang1 天前
nginx实用配置
运维·nginx
檀越剑指大厂1 天前
【Nginx系列】Tengine:基于 Nginx 的高性能 Web 服务器与反向代理服务器
服务器·前端·nginx
AI分享猿2 天前
小白学规则编写:雷池 WAF 配置教程,用 Nginx 护住 WordPress 博客
java·网络·nginx
敲不响的键盘2 天前
Nginx Location匹配与Proxy_pass匹配规则
运维·nginx