Nginx反向代理Node应用时,应通过正则匹配哈希文件(如app.a1b2c3.js)设1年强缓存(public, max-age=31536000, immutable),favicon.ico等无哈希资源设短缓存,index.html禁用强缓存,并启用sendfile、open_file_cache等优化,同时确保Node不覆盖Nginx缓存头。

Node 应用常通过 Nginx 做反向代理,静态资源(如构建产物 dist 中的 JS/CSS/图片)通常由 Nginx 直接服务。要延长浏览器缓存时间、减少重复请求,关键不是改 Node,而是精准配置 Nginx 的缓存响应头,并配合前端构建策略。
匹配带哈希的静态文件,设 1 年强缓存
现代前端构建工具(Webpack/Vite)会为 JS/CSS 文件自动添加内容哈希,如 app.a1b2c3.js。这类文件内容不变则文件名不变,可放心长期缓存:
- 在 Nginx 的
location块中用正则精准匹配哈希命名资源:location ~* \.[a-f0-9]{8,}\.(js|css|png|jpg|gif|webp|woff2|ttf)$ { - 直接设置强缓存头:
add_header Cache-Control "public, max-age=31536000, immutable";expires 1y; -
immutable能让浏览器跳过If-None-Match验证,真正“一次加载,全年有效”
对不带哈希的资源(如 favicon.ico、robots.txt)设短缓存或不缓存
这些文件可能人工更新但不改名,若缓存太久会导致用户看不到变更:
- 单独匹配:
location = /favicon.ico { add_header Cache-Control "public, max-age=86400"; } - 对 HTML 入口文件(
index.html)必须禁用强缓存:location = /index.html { add_header Cache-Control "no-cache, must-revalidate"; }
否则浏览器可能一直用旧 HTML,导致新 JS/CSS 加载失败
启用 Nginx 文件系统级优化,加速本地读取
即使缓存已生效,Nginx 每次读磁盘仍需开销。加几行能显著降低延迟:
-
sendfile on;:启用零拷贝,避免内核态到用户态复制 -
tcp_nopush on;:合并响应头与文件数据,减少 TCP 包数量 -
open_file_cache max=1000 inactive=30s;和open_file_cache_valid 60s;:缓存文件句柄和元信息,避免反复stat()系统调用
确保 Node 服务不干扰 Nginx 缓存头
如果 Node 应用(如 Express)也设置了 Cache-Control,可能覆盖 Nginx 的配置:
- 在 Express 中关闭静态资源的自动缓存头:
app.use(express.static('dist', { setHeaders: res => res.removeHeader('Cache-Control') })); - 让所有缓存控制权集中到 Nginx,避免多层头冲突
- 检查响应头是否最终生效:用
curl -I https://yoursite.com/app.a1b2c3.js,确认返回的是 Nginx 设置的Cache-Control,而非 Node 的


















