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

相关推荐
沐土Arvin9 小时前
Nginx 核心配置详解与性能优化最佳实践
运维·开发语言·前端·nginx·性能优化
haoranyyy21 小时前
mac环境中Nginx安装使用 反向代理
linux·服务器·nginx
再学一丢丢1 天前
Keepalived+LVS+nginx高可用架构
nginx·架构·lvs
xujiangyan_1 天前
nginx的自动跳转https
服务器·nginx·https
tingting01192 天前
k8s 1.30 安装ingress-nginx
nginx·容器·kubernetes
残花月伴2 天前
linux详细安装/配置(mysql/nginx/tomcat)
linux·mysql·nginx
Cloud_.2 天前
用Nginx实现负载均衡与高可用架构(整合Keepalived)
nginx·架构·负载均衡·keepalived
Shi_haoliu2 天前
各种网址整理-vue,前端,linux,ai前端开发,各种开发能用到的网址和一些有用的博客
linux·前端·javascript·vue.js·nginx·前端框架·pdf
LYX36932 天前
nginx https配置
运维·nginx