Доступен — Локальные цифровые продукты
HCA · Studio
TR — Контакты ↗
Заметка 08 · Сервер

Почему логи внезапно перестают писаться

Журнал доступа замер на какой-то дате: файл лежит, размер не меняется, в журнале ошибок пусто. Сайт продолжает работать. Вы теряете не только видимость — всё, что зависит от логов, тоже тихо останавливается.

Сервер
OpenLiteSpeed
Симптом
Лог замер
Побочный эффект
fail2ban слепнет
Короткий ответ

Главный процесс OpenLiteSpeed стартует от root, но обслуживающие запросы рабочие процессы понижаются до непривилегированного пользователя (обычно nobody или lsadm). Именно этот процесс открывает файл лога. Если каталог логов имеет права 750 и принадлежит другому пользователю, рабочий процесс не сможет его открыть — и не сообщит об этом как об ошибке, а просто перестанет писать. Проблема повторяется и после ротации: если новый файл создаётся с неверным владельцем, запись больше не возобновится. Решение — привести владельца и права каталога в соответствие с пользователем, от которого реально работает OpenLiteSpeed.

Симптом

Вы открываете журнал доступа, и последняя строка датирована неделями ранее. Сайт работает, посетители приходят, а в файл ничего не дописывается. В журнале ошибок подсказок нет — часто потому, что он лежит в том же каталоге и тоже не пишется.

Этот сбой особенно обманчив, потому что ничто не выглядит сломанным. Сервер здоров, страницы открываются, мониторинг зелёный. Просто вы ослепли.

Причина

OpenLiteSpeed применяет разделение привилегий: главный процесс стартует от root, чтобы занять привилегированные порты, а затем понижает обрабатывающие запросы процессы до непривилегированного пользователя. Файл лога открывает и пишет именно вторая группа.

В установках через панель каталог логов часто принадлежит пользователю сайта или root и имеет права 750. Это означает: «владелец читает, пишет и входит; группа читает и входит; остальные не могут ничего». Если рабочий пользователь OpenLiteSpeed не владелец и не в группе, он не может даже войти в каталог.

Неоткрываемый файл лога не является для OpenLiteSpeed фатальной ошибкой. Сервер продолжает обслуживать запросы и отбрасывает запись. Это разумное решение — сайт не должен падать из-за логирования, — но оно усложняет диагностику.

Какой пользователь

Чтобы выставить верные права, нужно знать, кто пишет. Ответ — в основной конфигурации:

grep -E '^user|^group' /usr/local/lsws/conf/httpd_config.conf

Можно подтвердить и по работающим процессам: первая строка — главный процесс (root), остальные — рабочие:

ps -eo user,group,comm | grep -E 'litespeed|lshttpd'

Рядом положите текущее состояние каталога логов:

ls -la /home/example.com/logs/

Если владелец каталога отличается от рабочего пользователя, а права — 750, причина найдена.

Решение

Чище всего отдать каталог группе, от которой работает OpenLiteSpeed, и дать этой группе право записи — так вы решаете задачу, не открывая каталог всем:

chgrp nogroup /home/example.com/logs
chmod 770 /home/example.com/logs

Исправьте владельца и у существующих файлов: верные права на каталог не помогут, если сам старый файл недоступен для записи:

chown nobody:nogroup /home/example.com/logs/*.log
/usr/local/lsws/bin/lswsctrl restart

После перезапуска отправьте запрос и убедитесь, что записи действительно идут, — не полагайтесь на предположение:

curl -sS -o /dev/null https://example.com/
tail -2 /home/example.com/logs/example.com.access_log

Сторона logrotate

Вот здесь начинается коварство. Вы исправляете права каталога, считаете задачу закрытой, а через несколько дней логи снова замирают. Причина — ротация создаёт новый файл с неверным владельцем.

В конфигурации ротации нужно явно указать, кому принадлежит новый файл:

create 0640 nobody nogroup

Если вы используете собственную настройку rollingSize в OpenLiteSpeed, файл создаёт он сам и проблемы не возникает. Путаница начинается там, где внешний logrotate и внутренняя ротация борются за один файл: выберите что-то одно, не запускайте оба.

Невидимый побочный эффект

Потеря лога неприятна сама по себе, но настоящая цена — всё, что от него зависит. Когда fail2ban не находит строк для чтения, он не выдаёт ошибку — он просто никого не банит. Jail показывается активным, вывод статуса выглядит здоровым, счётчик банов стоит на нуле.

fail2ban-client status wordpress-ols

Вы можете видеть «Currently failed: 0, Total banned: 0» не потому, что перебора паролей нет, а потому, что лог не читается. На сайте с реальным трафиком долгий ноль — не норма; проверьте, идут ли записи.

То же касается статистики трафика, отслеживания ошибок и аудита безопасности. Принимая сервер, одним из первых дел проверьте, относятся ли логи к сегодняшнему дню.

Итог

Молчаливые сбои дороже шумных: вы не знаете об их существовании, пока не решите их поискать. Права на каталог логов — хрестоматийный случай: одна ошибка в chmod отключает и видимость, и построенный поверх неё слой безопасности, не оставляя следов нигде. Добавьте в список обслуживания одну строку: последняя строка лога — сегодняшняя?

Быстрая справка
Причина
Рабочие процессы понижаются до пользователя, который не войдёт в каталог 750
Почему молча
Неоткрываемый лог не фатален для OpenLiteSpeed
Найти пользователя
grep -E '^user|^group' /usr/local/lsws/conf/httpd_config.conf
Решение
chgrp nogroup logs && chmod 770 logs плюс владелец файлов
Если повторяется
В logrotate нет строки create 0640 nobody nogroup
Конфликт
Не запускайте внешний logrotate и rollingSize на одном файле
Побочный эффект
fail2ban не сообщает об ошибке — он просто никого не банит
Проверка
Последняя строка лога — сегодняшняя?
Частые вопросы

О правах на логи.

Файл лога есть, но не растёт, а сервер работает. Почему?

Скорее всего, рабочий пользователь OpenLiteSpeed не может его открыть. Главный процесс стартует от root, но обрабатывающие запросы процессы понижаются до непривилегированного пользователя; если каталог логов имеет права 750 и этот пользователь не владелец и не в группе, он не может даже войти. OpenLiteSpeed не считает это фатальным и молча отбрасывает запись.

Я исправил права, но через несколько дней логи снова остановились.

Это ротация логов. Если созданный при ротации новый файл получает неверного владельца, запись снова прекращается. Добавьте в конфигурацию logrotate строку create 0640 nobody nogroup. И не запускайте внешний logrotate вместе с собственной настройкой rollingSize на одном файле.

Я поставил fail2ban, но он никого не банит. Есть связь?

Прямая. Когда fail2ban нечего читать, он не выдаёт ошибку: jail выглядит активным, счётчик банов стоит на нуле. На сайте с реальным трафиком это не норма. Сначала проверьте, идут ли записи в лог, и только потом — шаблон фильтра.

Решит ли проблему chmod 777?

Решит, но так делать не стоит. Право записи для всех позволяет любому процессу на сервере изменить или удалить записи, и журнал перестаёт быть надёжным источником для аудита. Правильный путь — отдать каталог группе OpenLiteSpeed и использовать 770.

Доступность и смета

Есть идея?
Можно даже одной фразой.