💻 Примеры: пошаговое восстановление сервера

К оглавлению урока

⚡ Краткий сценарий восстановления

# 1. SSH на сервер
ssh -i ich.pem ec2-user@18.192.103.67

# 2. Статус httpd
sudo service httpd status    # Active: inactive (dead)
sudo service httpd start

# 3. Попытка cp → No space left on device
cp /home/ec2-user/LocalSettings\ \(5\).php /var/www/html/mediawiki/LocalSettings.php

# 4. Диагностика диска
df -h                                      # 100%
find / -type f -size +100M -exec du -h {} + # access_log 7.0G

# 5. Очистить лог
sudo truncate -s 0 /var/log/httpd/access_log

# 6. Повторить cp + исправить $wgServer в vi

# 7. Исправить cron root + создать backup_logs.sh

Пошаговое воспроизведение проекта

Каждый шаг соответствует сценарию восстановления сервера из источника (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
  • Создан скрипт автоматической ротации логов