可通过try_files指令实现缓存优先:先检查本地缓存文件(如/var/cache/nginx$uri),命中则返回,未命中再proxy_pass回源;需手动约定缓存路径格式、确保文件含完整http响应结构,并配置命名location兜底。

可以通过 location 块中的 try_files 指令,让 Nginx 先尝试读取本地缓存文件,命中则直接返回,未命中再转发给后端服务。关键在于把缓存路径作为第一个选项,且确保缓存文件可被 Nginx 读取、命名与请求 URI 可映射。
缓存路径需与请求 URI 映射一致
Nginx 不会自动将请求生成缓存文件名,需配合 proxy_cache_path 的 levels 和 keys_zone,并用 proxy_cache_key 控制缓存键;但 try_files 本身只做文件系统路径检查,所以必须手动约定缓存落盘路径格式(例如按 URI 的 hash 或 base64 编码存储),或使用固定结构(如 /var/cache/nginx/$uri)。
- 推荐方式:用
map指令预处理$uri为安全的文件系统路径(过滤..、/等) - 示例:将
/api/user/123转为/var/cache/nginx/api_user_123,避免目录穿越 - 缓存文件需包含完整响应体 + 合适的响应头(如
Content-Type),可用 Lua 或外部程序生成,Nginx 原生不写缓存到任意路径
try_files 顺序决定优先级
try_files 按从左到右顺序检查文件是否存在,只要某个选项存在就停止并返回,后续不执行。因此要把本地缓存路径放第一位,后端代理放最后(用 @fallback 或 =404 触发)。
- 正确写法:
try_files /var/cache/nginx$uri $uri @proxy; - 注意:
$uri是解码后的路径,若缓存按原始 URI 存储,需用$request_uri(但含 query string,一般不用于文件名) - 若缓存是带扩展名的(如
.cache),要补全:try_files /var/cache/nginx$uri.cache /var/cache/nginx$uri @proxy;
缓存文件需具备合法 HTTP 响应结构
try_files 返回的是静态文件,Nginx 不解析其内容,所以缓存文件必须是“已组装好”的完整 HTTP 响应(含状态行、头、空行、正文),否则浏览器无法识别。通常不建议手动生成这种格式。
- 更实用的做法:用
proxy_cache配合proxy_cache_bypass和proxy_no_cache实现「缓存优先」逻辑,而非依赖try_files - 若坚持用
try_files,建议仅用于简单静态资源(如 JSON、HTML 片段),用脚本预生成,并设置好add_header补充必要头(如Content-Type: application/json) - 注意权限:Nginx worker 进程用户(如
www-data)需对缓存目录有读取权限
配合 proxy_pass 实现回源兜底
当 try_files 所有选项都未命中时,用命名 location(如 @proxy)承接,内部调用 proxy_pass 转发,并在成功响应后可触发异步缓存写入(需外部工具或 OpenResty)。
- 示例:
location @proxy { proxy_pass http://backend; } - 注意:不能在同一个
location中混用try_files和proxy_pass(除非用@named分离) - 若需回源后自动落盘,标准 Nginx 不支持,需借助
nginx-upload-module、Luangx.location.capture或外部 cache updater











