静态资源与缓存
静态资源
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 取值,二者不是同一功能。