核心是优化Nginx静态资源处理:精准正则匹配后缀启用sendfile、tcp_nopush、read_ahead;合理设置expires与Cache-Control;全局配置open_file_cache提升文件访问效率。

核心是让 Nginx 更快地定位文件、减少磁盘读取、降低网络传输量,并让浏览器复用缓存。关键不在“写多少 location”,而在于每一块是否精准匹配、是否启用对应优化指令。
精准匹配静态资源类型
用正则表达式匹配常见静态后缀,避免通用 location 规则干扰,提升匹配效率和指令应用准确性:
- 使用 ~*(不区分大小写)匹配图片、样式、脚本等资源,例如:
location ~* \.(jpg|jpeg|png|gif|css|js|woff2|ttf)$ { ... } - 这类匹配优先级高于普通前缀匹配,能确保缓存、压缩、高效传输等指令只作用于真正需要的文件类型
- 避免把所有静态请求都塞进
location /static/再统一处理,否则 HTML 或 JSON 等非目标资源可能被误加缓存头
启用高效文件传输与内核优化
在匹配到静态资源的 location 块中开启底层传输加速机制:
- sendfile on:跳过用户态拷贝,由内核直接将文件从磁盘送入 socket 缓冲区,大幅降低 CPU 和内存开销
- tcp_nopush on:配合 sendfile 使用,等待缓冲区填满或报文结束再发送,减少小包数量
- read_ahead 1m:对大文件(如视频、字体)预读,提前加载后续数据块,改善连续读取性能
合理配置缓存策略
通过响应头控制浏览器和中间代理如何缓存,减少重复请求:
-
expires 1y:对内容稳定、带版本号或哈希值的资源(如
/js/app.a1b2c3.js),设为 1 年,实现强缓存 -
add_header Cache-Control "public, max-age=31536000, immutable":比 expires 更灵活,
immutable告诉浏览器即使 F5 刷新也不需验证 - 对无版本控制的资源(如
/css/main.css),建议用较短周期,如expires 7d,并配合 ETag 或 Last-Modified 验证
启用文件句柄缓存
避免每次请求都 open/close 文件,尤其在高并发小文件场景下效果显著:
- 在
http块中全局配置:open_file_cache max=2000 inactive=30s;open_file_cache_valid 60s;open_file_cache_min_uses 2; -
max控制缓存条目上限,inactive表示 30 秒内未被访问则剔除,min_uses要求至少被命中 2 次才纳入长效缓存 - 搭配
open_file_cache_errors on可缓存不存在文件的失败结果,减轻反复 stat 压力


















