核心思路是先查本地缓存文件,命中则直接返回;未命中再通过命名location触发proxy_pass回源,Nginx本身不自动落盘,需配合预热、OpenResty或proxy_cache实现缓存写入。

用 try_files 配合 proxy_pass 实现缓存回源,核心思路是:**先查本地文件(缓存),命中就直接返回;没命中再走代理向后端拉取,并可选地把响应写入本地供下次使用**。Nginx 本身不自动“写缓存”,但能通过 try_files 控制访问路径优先级,再结合命名 location 和外部机制(如定时同步、OpenResty 或应用层落盘)完成闭环。
基本结构:三级 fallback 路径
try_files 不支持直接调用 proxy_pass,必须靠内部跳转触发。典型写法是:
-
第一级:检查带版本号或时间戳的本地缓存路径,例如
/cache/v2.3.1$uri -
第二级:查原始静态目录,例如
$uri(配合root /var/www) -
第三级:全部失败时跳转到命名 location,比如
@origin,里面执行proxy_pass
关键配置示例
假设静态资源部署在 /data/static,主源为 https://origin.example.com:
location /static/ {
root /data;
try_files /static/cache$uri /static$uri @origin;
expires 1y;
add_header Cache-Control "public, immutable";
}
location @origin {
proxy_pass https://origin.example.com;
proxy_set_header Host $host;
proxy_intercept_errors on;
error_page 502 503 504 = @backup;
}
location @backup {
proxy_pass https://backup.example.com;
proxy_set_header Host $host;
}
说明:
– /static/cache$uri 对应 /data/static/cache/xxx.js,是预热或主动缓存的路径
– /static$uri 对应 /data/static/xxx.js,是构建产物原始位置
– 所有路径都不存在时,才进 @origin 发起网络请求
注意 root/alias 与 URI 拼接逻辑
路径拼错会导致 $uri 始终找不到文件,这是最常见错误:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 用
root:Nginx 把root值和完整$uri拼起来,所以root /data;+ 请求/static/js/app.js→ 查/data/static/js/app.js - 用
alias:它会**替换掉 location 匹配的部分**,alias /data/static/;+location /static/+ 请求/static/js/app.js→ 查/data/static/js/app.js - 别在
try_files参数里直接拼变量,比如$cache_dir$uri是非法的;必须靠root或alias定义基础路径
如何让回源结果“自动落盘”?
Nginx 默认不保存回源响应到磁盘。要实现“访问即缓存”,有几种实用方式:
-
手动预热:用脚本定期请求热门资源,配合
curl -o写入/data/static/cache/目录 -
应用层写入:后端在响应头中加
X-Cache-Write: true,Nginx 用map判断并触发异步落盘(需 OpenResty) -
反向代理缓存模块:改用
proxy_cache(非try_files方案),适合通用场景,但无法精细控制缓存路径结构
如果只是轻量级静态托管,推荐预热 + try_files 组合,简单可控,不依赖额外组件。










