核心思路是通过分层缓存与高效传输机制减少nginx磁盘访问、回源和重复请求:①浏览器端用expires+cache-control控制静态资源缓存;②服务端配置proxy_cache实现多级代理缓存;③启用open_file_cache和sendfile提升文件读取与传输效率。

核心思路是让 Nginx 尽可能少地访问磁盘、少地回源、少地处理重复请求——缓存要落在离用户更近、读取更快的位置,并配合高效传输机制。
用 expires + Cache-Control 控制浏览器端缓存
对图片、CSS、JS、字体等不变或极少变的资源,直接告诉浏览器“本地留着用,不用再问服务器”:
- 在 location 块中匹配文件后缀,例如 location ~* \.(jpg|png|css|js|woff2)$
- 设置 expires 30d(30 天过期)或更长,如字体可设为 expires 365d
- 搭配 add_header Cache-Control "public, immutable",明确声明资源不可变,避免协商缓存开销
- 启用 gzip_static on,让 Nginx 直接返回预压缩的 .gz 文件,省去运行时压缩耗时
配置 proxy_cache 实现服务端代理缓存
当用户请求未命中浏览器缓存,或需统一控制 CDN/边缘节点行为时,Nginx 自身缓存能大幅降低后端压力:
- 先定义缓存区:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=static_cache:100m max_size=50g inactive=7d use_temp_path=off
- 在静态资源 location 中启用:proxy_cache static_cache
- 按状态码分级缓存:proxy_cache_valid 200 304 7d;对错误响应可设短缓存(如 proxy_cache_valid 500 502 503 504 10s)提升容错性
- 加响应头便于调试:add_header X-Cache-Status $upstream_cache_status
启用系统级文件缓存与零拷贝传输
减少内核态与用户态切换、避免重复读盘,是吞吐量跃升的关键底层支撑:
- 开启 open_file_cache max=100000 inactive=300s,复用文件句柄和元数据,避免每次 open/stat 系统调用
- 配合 open_file_cache_valid 300s 和 open_file_cache_min_uses 2,只缓存高频访问文件
- 启用 sendfile on 和 tcp_nopush on,实现内核零拷贝传输,尤其适合大文件(如图片、视频)
- 对大静态文件(>1MB),可考虑 aio on + directio 4k,绕过页缓存直读磁盘,提升 IO 吞吐
分层缓存与智能回源策略
应对高并发场景(如秒杀、大促),单层缓存易成瓶颈,需多级协同:
- 内存级热点缓存:proxy_cache_path /dev/shm/nginx_cache ... keys_zone=hot_cache:50m,用于极热资源(如 logo、首屏 JS)
- 磁盘级持久缓存作为后备:proxy_cache_path /data/nginx/cache ... keys_zone=disk_cache:2g
- 在 location 中优先查内存:proxy_cache hot_cache,未命中时自动 fallback 到磁盘缓存(配合 proxy_cache_background_update on)
- 设置 proxy_next_upstream error timeout http_500,避免单点故障拖垮整体可用性











