Перейти к основному контенту

Свобода! Равенство! Упячка!

Про стандартные грабли в Nginx

В mailing-листе nginx народ постоянно и с редким упорством наступает на одни и те же грабли. Вот некоторые из них:

  • $query_string (она же $args - аргументы в строке запроса) не тестируется при поиске подходящего location, матчится только URI директива error_log off не отключит лог ошибок, а создаст файл с именем off в дефолтовом месте для логов. Для отключения логов можно сказать нечто вроде error_log /dev/null;
  • nginx не умел, не умеет и, по словам разработчика, никогда не будет уметь писать логи в pipe. Вместо этого принято ротировать логи с нужной частотой и уже после этого выполнять их парсинг;
  • Директиву if (в силу того, что она де-факто создает фейковый location и является своего рода хаком в nginx) гарантированно безопасно можно использовать лишь в сочетании с rewrite или return. Все прочие варианты использования могут привести как к “неправильной” с точки зрения логики работе содержимого if {}, так и к падению;
  • В nginx, в отличие от apache, нет макросов и глобальных локейшнов. Для минимизации размера конфига можно воспользоваться метаразметкой и генератором конфига своего изготовления. Либо директивой include;
  • Использование мемори-дисков для хранения часто запрашиваемой статики бессмысленно, так как для современных ОС “эмпирическим путём давно выяснено, что при использовании nginx’а оптимальный размер мемори диска равен нулю.” (Игорь Сысоев). Часто потребляемые файлы и так попадут в кеш.