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监控缓存命中率。

相关推荐
绝不偷吃7 小时前
FastDFS分布式储存
linux·nginx
java1234_小锋9 小时前
解释一下NGINX的反向代理和正向代理的区别?
运维·nginx
PanZonghui17 小时前
Centos项目部署之Nginx 的安装与卸载
linux·nginx
charlee441 天前
nginx部署发布Vite项目
nginx·性能优化·https·部署·vite
CRMEB定制开发1 天前
【实战】CRMEB Pro 企业版安装教程(附 Nginx 反向代理配置 + 常见问题解决)
nginx·商城系统·微信商城·crmeb
孙克旭_2 天前
day045-nginx跳转功能补充与https
linux·运维·nginx·https
博同学2 天前
Nginx + ELK + Grafana 全球访问热力图
nginx·elk·grafana
RW~2 天前
Minio安装配置,桶权限设置,nginx代理 https minio
运维·nginx·https·minio
CodeWithMe2 天前
Nginx入门进阶:从零到高手的实战指南
运维·nginx
Ahlson2 天前
【fnNAS】docker的nginx配置html
nginx·docker·容器·fnnas