Перейти к содержанию

try_files без open_file_cache

Идентификатор проверки Gixy: 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

Используйте NGINX Extras от GetPageSpeed для постоянно обновляемого NGINX и модулей на RHEL/CentOS/Alma/Rocky. Подробнее.