Пошаговое воспроизведение проекта
Каждый шаг соответствует сценарию восстановления сервера из источника (15 шагов).
Шаг 1–4: Подключение и запуск httpd
Шаг 1. Получить ссылку на сайт и убедиться, что он не работает:
http://18.192.103.67/ — браузер показывает ошибку соединения.
Шаг 2. Подключиться к серверу по SSH:
ssh -i ich.pem ec2-user@18.192.103.67
Флаг -i — путь к приватному ключу. Файл ключа должен иметь права 600.
Шаг 3. Посмотреть статус httpd:
sudo service httpd status
Вывод: Active: inactive (dead) — сервис остановлен.
Шаг 4. Запустить сервис:
sudo service httpd start
Шаг 5–8: Обнаружение проблемы с диском
Шаг 5. Попытаться скопировать файл настроек (имя с пробелами!):
# Источник находится в /home/ec2-user/
# Пробелы и скобки в имени нужно экранировать
cp /home/ec2-user/LocalSettings\ \(5\).php \
/var/www/html/mediawiki/LocalSettings.php
Результат: cp: failed to extend '...': No space left on device
Шаг 6. Проверить ошибку в логах:
# /var/log/httpd/error_log
cat /var/log/httpd/error_log | tail -20
Видим: (28)No space left on device: AH00646: Error writing to logs/access_log
Шаг 7. Проверить свободное место:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p1 10G 10G 0 100% /
Диск занят на 100%, свободного места нет.
Шаг 8. Найти большие файлы:
find / -type f -size +100M -exec du -h {} +
7.0G /var/log/httpd/access_log
185M /var/log/httpd/log_20240402.tar.gz
108M /usr/lib/locale/locale-archive
Виновник найден: access_log занимает 7 ГБ из 10 ГБ.
Шаг 9–12: Восстановление диска и конфигурации
Шаг 9. Очистить access_log:
# Правильный способ: truncate (работает с sudo)
sudo truncate -s 0 /var/log/httpd/access_log
# Или через tee
sudo tee /var/log/httpd/access_log < /dev/null
sudo echo "" > /var/log/httpd/access_log — перенаправление выполняется от имени текущего пользователя, а не root, и может выдать «Permission denied». Подробнее в Ошибках.
Шаг 10. Убедиться, что место освободилось:
df -h
Шаг 11. Скопировать файл настроек (теперь должно сработать):
cp /home/ec2-user/LocalSettings\ \(5\).php \
/var/www/html/mediawiki/LocalSettings.php
Шаг 12. Исправить ошибку в конфигурации — неверный IP:
# /var/www/html/mediawiki/LocalSettings.php
# Найти строку с $wgServer:
grep "wgServer" /var/www/html/mediawiki/LocalSettings.php
$wgServer = "https://18.153.51.162";
Исправить через vi:
vi /var/www/html/mediawiki/LocalSettings.php
В vi: введите :%s/18.153.51.162/18.192.103.67/g и нажмите Enter. Сохранить: :wq
Шаг 13–15: Исправление cron и скрипт ротации логов
Шаг 13. Проверить cron root и обнаружить некорректное задание:
sudo crontab -l
* * * * * tar -czf /var/log/httpd/log_$(date +\%Y\%m\%d).tar.gz -C /var/log/httpd .
Проблемы: каждую минуту, архивирует сам себя (папка та же).
Исправить: изменить интервал на 0 0 * * * (ежедневно в полночь) и убрать задание, заменив на backup_logs.sh.
Шаг 14. Создать скрипт backup_logs.sh:
# /home/ec2-user/backup_logs.sh
#!/bin/bash
LOG_DIR="/var/log/httpd"
LOG_FILE="access_log"
BACKUP_DIR="/var/log/httpd/backups"
DATE=$(date +%Y%m%d)
ARCHIVE="$BACKUP_DIR/$LOG_FILE-$DATE.tar.gz"
# Создать директорию для архивов, если не существует
mkdir -p "$BACKUP_DIR"
# Архивировать лог-файл
tar -czf "$ARCHIVE" -C "$LOG_DIR" "$LOG_FILE"
# Очистить лог после архивации
truncate -s 0 "$LOG_DIR/$LOG_FILE"
# Удалить архивы старше 3 дней (хранить не более 3 копий)
find "$BACKUP_DIR" -type f -name "$LOG_FILE-*.tar.gz" -mtime +3 -exec rm {} \;
Шаг 15. Добавить права исполнения и задание в crontab:
chmod +x /home/ec2-user/backup_logs.sh
# Добавить в crontab (от текущего пользователя или root)
crontab -e
Добавить строку:
0 0 * * * /home/ec2-user/backup_logs.sh
Расшифровка: 0 0 * * * — в 00:00 каждый день.
Результат — что восстановлено
- Перезапущен веб-сервис Apache httpd
- Очищено дисковое пространство (access_log 7 ГБ → 0)
- Восстановлен конфигурационный файл
LocalSettings.php - Исправлена ошибка в
$wgServer - Исправлено некорректное задание cron
- Создан скрипт автоматической ротации логов