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

相关推荐
Hello.Reader1 小时前
洞悉 NGINX ngx_http_access_module基于 IP 的访问控制实战指南
tcp/ip·nginx·http
PWRJOY6 小时前
在 Ubuntu 24.04 系统上安装和管理 Nginx
linux·nginx·ubuntu
菠萝崽.13 小时前
安装docker,在docker上安装mysql,docker上安装nginx
java·mysql·nginx·docker·软件工程·springboot·开发
java1234_小锋21 小时前
什么是WebSocket?NGINX如何支持WebSocket协议?
websocket·网络协议·nginx
Hello.Reader1 天前
基于 Nginx 的 WebSocket 反向代理实践
运维·websocket·nginx
ak啊1 天前
Nginx 常见问题总结与解决
nginx
古月的三个锦囊1 天前
Nginx openresty web服务 与 Go 原生web服务性能对比
nginx·go·openresty
异常君1 天前
Nginx 架构深度剖析:多进程单线程模型与异步事件驱动
后端·nginx·架构
java1234_小锋1 天前
什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?
开发语言·nginx·lua
我科绝伦(Huanhuan Zhou)1 天前
Nginx性能优化:从配置到缓存,全面提升Web服务器性能
nginx·缓存·性能优化