nginx try_files指令解读
try_files 是 Nginx 里一个非常实用的指令,用来按顺序检查文件是否存在,并把请求重定向到第一个存在的目标。它常被用来做静态资源优先、SPA 路由兜底、伪静态等。
典型例子
1 | location / { |
执行流程是:
- 先找
/data/www$uri是否存在 - 再找
/data/www$uri/(目录)是否存在 - 都不存在时,把请求交给
/index.html
流程图
flowchart TD
A[客户端请求 URI] --> B{文件 $uri 存在?}
B -- 是 --> C[直接返回文件]
B -- 否 --> D{目录 $uri/ 存在?}
D -- 是 --> E[返回目录索引或 index 文件]
D -- 否 --> F[转发到 /index.html]
使用场景
1.SPA 前端(Vue/React)路由兜底
浏览器访问:
/user/profile
但服务器上只有:
index.html
用:
1 | try_files $uri $uri/ /index.html; |
让前端路由接管。
2.静态优先,动态兜底(PHP 示例)
1 | location / { |
3.防止 404 直接落到后端
反向代理时:
1 | location / { |
只有文件不存在时才打到后端。
4.root 与 alias 的区别
错误配置常见:
1 | location /static/ { |
alias 下 $uri 拼接方式不同,路径容易错位。
5.最后一个参数可以是状态码
1 | try_files $uri $uri/ =404; |
找不到直接返回 404。
性能角度思考
在高并发场景中:
- try_files 只做文件存在检查(stat syscall)
- 开销远小于进入后端服务
- 适合做第一层流量过滤
高并发 Nginx 的常见策略是:
静态命中 → Nginx 返回
未命中 → 后端处理
减少应用服务器负载。
Nginx看作流量入口,try_files 就像第一道逻辑分流阀门——尽量在最靠近用户的位置解决请求,把昂贵计算留给真正需要它的部分。这种越早处理越省资源的思路,同样适用于缓存、CDN、WAF、甚至服务网格的整体架构演进。