On Mon, Feb 12, 2024 at 01:15:53AM +0200, Gena Makhomed wrote: > Ротация логов делается с помощью программы logrotate, которая делает > ротацию только по времени и никак не смотрит на количество свободного места > на диске и на размер лог-файла.
Насчёт размера файла утверждение неверное: в конфиге logrotate можно указать директиву "size", которая будет означать предельный размер лог-файла, по достижении которого запускается ротация. Другое дело, что риалтаймовского триггера на достижение предельного размера файла нет. А он мог бы быть в nginx-е, среди опций access_log и error_log. > # logrotate --force /etc/logrotate.d/nginx > > можно будет запускать как угодно часто, например, раз в час или даже раз в > минуту, проверяя предварительно количество свободного места на диске или > размер файла или по каким-то другим условиям. Проверять занятое место на партиции можно хоть раз в секунду и даже чаще. Но нет смысла чаще, чем интервал сброса файловых кэшей ядром. > Это может быть полезно в случае DDoS-атак, чтобы не не было > таких неожиданных ситуаций, что место на сервере внезапно закончилось, Для DoS-атак как раз и полезно разделение обязанностей между рабочим процессом сервиса и процессом-писателем логов. Я уже упоминал здесь сквидовский logfile-daemon, это один из вариантов, как можно обезопасить рабочий процесс от ступора. Но не самый эффективный, поскольку запись через пайп -- это значительное количество сисколов с обеих сторон, с копированием данных в ядро из писателя и обратно читателю. Гораздо эффективней сделать циклический буфер в разделяемой памяти, к которой подключаются два процесса/треда -- рабочий и писатель логов. Запись в такой буфер и чтение из него никаких сисколов не требует. Останется лишь минимизировать расходы на взаимные блокировки, которые, вероятно, также можно сделать без сисколов, если поискать специальные алгоритмы на этот счёт... В итоге получится быстрая запись и быстрое независимое чтение, причём если второе сдохнет или начнёт захлёбываться, писателя это не убьёт. Конечно, программирование всего этого -- немаленькая работа. А костыли в виде логов в оперативной памяти, logrotate и питоновских скриптов можно, конечно, нагородить. Но в современной ситуации, я думаю, проще сделать триггер, который по обнаружении катастрофической нехватки места для логов просто отключит логгирование в nginx-e. > 3) не делать автоматической защиты от DDoS через исчерпание свободного > места на диске - потому что идеологически правильно чтобы эту проблему > вручную устранял системный администратор, потому что старые логи важны > и нужны. Работоспособность web-сервиса, как правило, намного важнее логгирования. -- Eugene Berdnikov _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-ru