Вопрос или проблема
Сегодня небо упало, и весь мой мир погрузился в темноту после отображения ошибки фатальная ошибка: ошибка закрытия /tmp/cc8d7Oap.s: Недостаточно места на устройстве
После прочтения этой темы я запустил df -h -T
, чтобы обнаружить, что мой корневой диск на 32 ГБ действительно был заполнен на 100%.
Я переместил свою пользовательскую директорию /home/jay
на другой диск, создал симлинк обратно к ней и, вуаля, я снова в деле с 6 ГБ свободного места, и C++ снова компилируется.
Так я пью чай и продолжаю обновлять свой совершенно не относящийся к жизни файл C++, когда фатальная ошибка: ошибка закрытия /tmp/cc8d7Oap.s: Недостаточно места на устройстве
снова начинает меня преследовать.
Я запустил df -h -T
, и корневой диск снова переполнен, всего через несколько часов.
На этот раз я начал смотреть на размеры файлов, задаваясь вопросом, как же я использовал 6 ГБ места всего за несколько часов, и narrowed the problem down to a log file at /var/log/apache2/error.log
, который весил 16 ГБ, ДА ГБ
Глупо не подумав о том, что у меня нет места на диске, я открыл этот очень большой текстовый файл, и компьютер завис на некоторое время, прежде чем полностью отключиться.
Я снова включил его и увидел экран входа в систему (обычно не отображается, по умолчанию он просто входит как пользователь/Jay), но не смог пройти мимо экрана входа, так как он говорит, что мой пароль неверный, хотя я знаю, что это не так.
На этом этапе я не знаю, вызван ли этот сбой входа отсутствием места на диске или тем, что я изменил /home/Jay
на симлинк перед его сбоем.
Я установил физический диск в другой компьютер, удалил 16 ГБ лог-файл, снова установил диск в своем компьютере и нажал кнопку питания, вуаля, я снова в деле.
На этот раз я проверяю лог-файл /var/log/apache2/error.log
, и, как и ожидалось, он пуст. Я открываю Firefox, нажимаю “восстановить последние страницы”, затем снова проверяю лог ошибок (не прошло больше 10 секунд).
Виновник, 88247 строк (да, 88 тысяч), которые читаются
[Пн Ноя 11 00:28:30.277591 2024] [php:warn] [pid 1670:tid 1670] [client 192.168.1.1:42860] PHP Warning: Undefined variable $name in /S1/D1/web/???.co.uk/iot/index.php on line 376
Я вижу, что решение моей непосредственной проблемы заключается в том, чтобы перейти к файлу index.php и исправить строку 376, задача выполнена.
Но мой вопрос действительно в том.
Есть ли что-то, что я могу сделать, чтобы предотвратить это в первую очередь (например, ограничить размер журнала или что-то подобное), поскольку глупый пользователь с доступом к изменению веб-страницы (да, это буду я) может в одиночку вырубить весь сервер, даже не пытаясь быть злонамеренным.
Я думаю, было бы неплохо увидеть какое-то обновление для apache2, которое ограничивало бы повторяющийся вывод идентичных сообщений об ошибках в течение заданного временного промежутка, хотя я не знаю, где можно было бы выразить это предложение или как сложно было бы это реализовать.
Ответ или решение
Разбирая причину возникновения ситуации с переполнением лог-файла error.log
Apache2, и, соответственно, с проблемой "нет места на устройстве" (No space left on device), важно учесть несколько аспектов, касающихся управления логами и предотвращения подобных инцидентов в будущем.
1. Описание проблемы с логами Apache2
При работе с веб-сервером Apache2 ошибки PHP, возникающие на вашем сайте, записываются в файл логов, обычно расположенный в /var/log/apache2/error.log
. Если ошибки, такие как "Undefined variable", возникают слишком часто, количество записей может быстро возрасти, заполнив весь доступный дисковый объем. В вашем случае 88,247 записей за короткий срок привели к росту файла логов до 16 ГБ, что является чрезмерным значением для сохранения логов.
2. Способы предотвращения переполнения лог-файла
a. Конфигурация Apache для управления логами
-
Ротация логов: Один из самых эффективных способов ограничения размера файлов логов – это использование механизма ротации. Это позволяет автоматически перемещать, сжимать и удалять старые файлы логов. Вы можете настроить ротацию логов, отредактировав файл конфигурации
/etc/logrotate.d/apache2
.Пример настройки:
/var/log/apache2/*.log { daily missingok rotate 7 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /usr/sbin/apache2ctl graceful > /dev/null endscript }
Вышеописанное правило выполняет ротацию логов ежедневно и хранит последние 7 версий.
-
Изменение уровня логирования: Если вам не нужны все предупреждения, вы можете изменить уровень логирования в конфигурационных файлах Apache. Например, вы можете установить уровень логирования на
error
, чтобы исключить предупреждения PHP:LogLevel error
b. Профилактика в коде
Идентификация и исправление причин возникновения ошибок в PHP также поможет снизить нагрузку на логи. В вашем случае, необходимо исправить строку 376 в файле index.php
, где возникает предупреждение о неопределенной переменной. Использование отладчиков и статического анализа кода поможет выявить такие ошибки до их появления в рабочей среде.
c. Ограничение логирования в PHP
Дополнительно, вы можете настроить конфигурацию PHP для ограничения частоты повторяющихся ошибок в логах, используя параметр log_errors_max_len
для управления размерами записей, а также использовать функции, такие как set_error_handler()
, для более гибкого контроля ошибок.
3. Предложения по улучшению Apache
Ваше предложение относительно возможности ограничивать повторное логирование идентичных ошибок в заданный временной промежуток является разумным. Для этого можно внести предложения в официальный репозиторий Apache через каналы поддержки и обсуждений. Это может быть реализовано через плагин или дополнительный модуль, который будет обрабатывать дублирующиеся сообщения в логах.
Заключение
Чтобы избежать ситуации с переполнением лог-файлов и обеспечением стабильной работы веб-сервера Apache, рекомендуется внедрение механизма ротации логов, изменение уровня логирования, а также регулярное исправление ошибок в коде ваших PHP-скриптов. Эти оптимизации позволят значительно сократить использование дискового пространства, предотвратив неприятные ситуации в будущем.
Если возникнут дополнительные вопросы о конфигурации Apache или управлении логами, не стесняйтесь обращаться за помощью.