Skip to content

静态资源与缓存

静态资源

nginx
server {
    root /srv/app;

    location ^~ /assets/ {
        try_files $uri =404;
        access_log off;
    }
}

sendfile on 可以利用操作系统提供的高效文件传输路径,但实际是否 Zero-copy、经过多少次复制取决于操作系统、TLS、文件系统和 Nginx 构建,不能简化成“数据永远不进入 User Space”。

浏览器缓存

带 Content Hash 的资源可以长期缓存;HTML Entry 通常要求重新验证:

nginx
location ^~ /assets/ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    try_files $uri =404;
}

location = /index.html {
    expires -1;
    add_header Cache-Control "no-cache";
}
  • no-cache 允许存储,但复用前必须验证。
  • no-store 表示不应存储。
  • immutable 只适合 URL 随内容变化的资源。
  • add_header 的继承具有独立规则;在子级重新定义任一 add_header 时要检查其他 Header 是否仍存在。

Gzip

nginx
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_types text/plain text/css application/javascript application/json application/xml image/svg+xml;

压缩等级不是越高越好。高等级会消耗更多 CPU,收益应使用实际资源和流量压测。JPEG、PNG、WebP、MP4 等已压缩格式通常无需再次 Gzip。

Proxy Cache

nginx
proxy_cache_path /var/cache/nginx
    levels=1:2
    keys_zone=api_cache:20m
    max_size=5g
    inactive=30m
    use_temp_path=off;

server {
    location /catalog/ {
        proxy_cache api_cache;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_cache_valid 200 1m;
        proxy_cache_valid 404 10s;
        add_header X-Cache-Status $upstream_cache_status always;
        proxy_pass http://backend;
    }
}

启用前必须设计 Cache Key、TTL、Purge/Invalidation、Authorization、Cookie、Vary 和错误缓存。用户相关响应若 Cache Key 不包含身份维度,可能造成严重数据泄露。

proxy_no_cache 控制 Response 是否保存,proxy_cache_bypass 控制当前 Request 是否从 Cache 取值,二者不是同一功能。