使用location配合root或alias提供静态html服务并设置合理cache-control头,是轻量高效的服务端缓存方式;需禁用proxy_pass、启用open_file_cache及sendfile优化。

直接用 location 配合 root 或 alias 提供静态页面服务,并通过响应头控制浏览器缓存,是服务端缓存加速最轻量、最高效的方式——它不走代理、不写磁盘副本,只告诉浏览器“这个 HTML 文件可以本地存多久”,同时减少 Nginx 自身的文件系统开销。
让静态 HTML 走纯文件服务,不经过 proxy_pass
这是前提。很多配置误把 location / 或 location /index.html 指向 proxy_pass,导致本可直读磁盘的 HTML 反而多绕一层后端。正确做法是:
- 用
root:例如root /var/www/html;+location / { try_files $uri $uri/ /index.html; },请求/about.html就读取/var/www/html/about.html - 用
alias:适合路径映射,如location /pages/ { alias /opt/static_pages/; },访问/pages/help.html对应磁盘上/opt/static_pages/help.html - 务必删掉或注释掉该 location 下的
proxy_pass,否则expires和Cache-Control可能被上游覆盖或失效
给 HTML 设置合理缓存策略
HTML 缓存不能简单套用 JS/CSS 的 immutable,需按发布机制区分:
- 带哈希或版本号的 HTML(如
/v2.3/index.html、/app-7f8a1b.html):可设长期缓存add_header Cache-Control "public, max-age=31536000, immutable"; - 无版本号、手动更新的 HTML(如
/index.html):建议短时效 + 强校验add_header Cache-Control "public, max-age=3600, must-revalidate";
这样浏览器每小时会发一次If-None-Match请求,Nginx 返回 304 即可,省带宽不丢更新 - 含用户态内容的 HTML(如登录态 header、个性化 banner):禁用缓存
add_header Cache-Control "no-cache, no-store, private";
配套优化,降低 Nginx 读 HTML 的开销
高频访问下,反复 stat() 查 HTML 文件是否存在、是否被修改,会成为瓶颈。启用 open_file_cache 能显著缓解:
- 在
http{}块中加:open_file_cache max=10000 inactive=60s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on; - 它缓存的是文件元数据(大小、修改时间、权限),不是 HTML 内容本身,对所有
root/alias位置都生效 - 搭配
sendfile on;和tcp_nopush on;,让内核直接送 HTML 文件进网络栈,避免用户态拷贝
验证是否生效
用 curl 检查响应头即可确认:
curl -I https://yoursite.com/index.html- 看到
Cache-Control或Expires字段,且状态码为 200(非 304)说明服务端已发出缓存指令 - 刷新页面后第二次请求若返回 304,说明浏览器已启用协商缓存;若仍返回 200 且含
X-Cache-Status(需额外配置),才说明用了proxy_cache——但对纯静态 HTML,通常不需要这层











