跳转至

没有 open_file_cache 的 try_files

Gixy 检查 ID:try_files_is_evil_too

try_files 指令通常在 nginx 中用于在回退到其他选项之前检查文件是否存在。但是,如果没有 open_file_cache,每个请求都会触发多个 stat() 系统调用,这可能会显著影响性能。

为什么这很重要

对于每个请求,try_files 使用 stat() 系统调用执行文件存在性检查。没有缓存时:

  • 高 I/O 开销:每个请求导致多次磁盘操作
  • 性能下降:在负载下,这成为瓶颈
  • 延迟增加:特别是在网络文件系统上(NFS、分布式存储)

错误示例

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

每个请求将在没有任何缓存的情况下执行 2-3 次 stat() 调用。

正确示例

# 在 http 或 server 级别启用文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

使用 open_file_cache,nginx 缓存文件元数据,大大减少 stat() 调用。

缓存配置选项

指令 描述
open_file_cache max=N inactive=T 缓存最多 N 个条目,不活动 T 后过期
open_file_cache_valid T 多久验证一次缓存条目
open_file_cache_min_uses N 缓存前的最小访问次数
open_file_cache_errors on 也缓存"文件未找到"错误

何时禁用此检查

如果您提供的动态内容文件经常更改,或者使用 RAM 磁盘,性能影响可能可以忽略不计。您可以在 gixy 配置中禁用此特定检查。

参考资料

加固 NGINX,使用维护的 RPM

使用 GetPageSpeed 提供的 NGINX Extras 在 RHEL/CentOS/Alma/Rocky 上获取持续更新的 NGINX 与模块。 了解更多.