В этом руководстве описывается, как создавать автоматизированные резервные копии корневого каталога документов веб-сервера и файлов конфигурации Nginx с помощью утилит tar
, rsync
и cron
. Пример расписания выполняется ежедневно, а резервные копии сохраняются в течение одного года.
Предпосылки
- Сервер с Ubuntu 24.04 в качестве ОС
- Права пользователя: пользователь root или обычный пользователь с привилегиями sudo
Вы можете адаптировать это руководство для других веб-серверов и дистрибутивов Linux с небольшими изменениями. Используемые команды являются стандартными для большинства дистрибутивов Linux.
Конвенции
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя
Обновите систему
Свежая установка Ubuntu 24.04 требует обновления пакетов до последних доступных версий.
$ sudo apt-get update -y && sudo apt-get upgrade -y
Правило 3-2-1
Правило резервного копирования 3-2-1 гласит, что вам нужны три копии ваших данных. В дополнение к основной рабочей копии вам нужны две резервные копии, хранящиеся на разных типах носителей, одна из которых должна быть вне офиса. С этой системой вы вряд ли потеряете свои данные.
1. Подготовка к резервному копированию
Перед созданием резервной копии убедитесь, что на веб-сервере достаточно места на диске.
$ df -h
Сравните это с размером корневого каталога вашего веб-сайта и файлов конфигурации Nginx, а также любых других каталогов, которые вы хотите создать:
$ du -sh /var/www
$ du -sh /etc/nginx
Убедившись, что для выполнения резервного копирования достаточно места, создайте каталог для локальной резервной копии.
$ sudo mkdir /var/web_backup
2. Выполнение резервного копирования
Создайте резервную копию корневого каталога документов веб-сервера и каталога конфигурации Nginx с помощью tar
. Назовите этот файл web-server.tar.gz
.
$ sudo tar -cvzpf /var/web_backup/web-server.tar.gz -C /var/ www -C /etc/ nginx
Аргументы (-cvpzf -C
) в команде указывают следующее:
c
- Создать архивv
- Подробноz
- Сжать файл с помощьюgzip
p
- Сохранение прав доступа к файламf
- Путь и имя файла архиваC
- Изменить каталог
Обратите внимание на пробел после /var/
и /etc/
в команде перед указанием имени каталога для резервного копирования. Включите любые другие каталоги, которые вы хотите сделать резервными, с помощью дополнительных аргументов -C
в команде.
Как исключить файлы
Чтобы исключить файл или каталог из архива, используйте --exclude=path/to/file/
. Например, если вы хотите исключить каталог /var/www/example.com/junk/
, используйте:
$ sudo tar -cvpzf /var/web_backup/web-server.tar.gz --exclude=www/example.com/junk -C /var/ www -C /etc/ nginx
Примечание: не включайте полный путь при указании того, что следует исключить, используйте относительный путь. Например, используйте
www/example.com/junk
вместо/var/www/example.com/junk
. Используйте несколько директив--exclude=path/to/file/
при исключении нескольких файлов и каталогов. Вы также можете использовать файл исключения, если у вас много каталогов для исключения.
3. Тестирование восстановления
Перед автоматизацией процесса убедитесь, что вы можете восстановить файлы. Сначала создайте тестовый каталог для восстановления.
$ sudo mkdir /var/web_backup/restored/
Восстановите архив в каталог.
$ sudo tar -xvzpf /var/web_backup/web-server.tar.gz -C /var/web_backup/restored/
Команда extract имеет несколько новых аргументов:
x
- Извлечь архивz
- Распаковать архив
Проверьте, что восстановление прошло успешно, выведя список содержимого.
$ ls -lh /var/web_backup/restored/
После проверки удалите тестовый каталог:
$ sudo rm -r /var/web_backup/restored/
4. Автоматизация с помощью Cron
Утилита cron
планирует выполнение команд в определенное время. В этом примере ежедневное резервное копирование будет запланировано на 02:00, и будет сохраняться по одной резервной копии на каждый день недели, а также будет использоваться команда date
для присвоения архиву имени в соответствии с днем недели, когда он был создан.
$ sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ nginx
Переменная +\%a
указывает, что дата должна быть возвращена как сокращенный день недели. Например, «Пн», «Вт» и т.д. Команда tar
перезапишет ежедневный архив предыдущей недели.
Добавьте задание в crontab
Расписания cron
хранятся в файле с именем crontab. Типичная запись crontab начинается с пяти значений (или звездочек), за которыми следует команда. Значения сообщают cron
, когда выполнять команду, а звездочка означает «все».
* * * * * команда, которая должна быть выполнена
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (воскресенье = 0 или 7)
| | | ------- Месяц (1 - 12)
| | --------- День месяца (1 - 31)
| ----------- Час (0 - 23)
-------------- Минута (0 - 59)
Чтобы отредактировать crontab, выполните:
$ sudo crontab -e
Добавьте команду tar
в конец файла, включая расписание в начале:
00 02 * * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ nginx
Это запланирует cron
для запуска команды в 02:00, каждый день любого месяца.
12-месячное хранение
Чтобы сохранять ежемесячные резервные копии, используйте другое расписание, которое добавляет к имени файла сокращенное название месяца с помощью параметра +\%b
к команде. Чтобы проверить команды date
перед тем, как вставлять их в имя файла, используйте echo
для их вывода:
$ echo `date +\%b`
Добавьте это в новую строку в crontab
:
0 0 1 * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%b`.tar.gz -C /var/ www -C /etc/ nginx
Это запланирует cron
для запуска ежемесячного резервного копирования в 00:00, в первый день месяца. Через год старые архивы будут перезаписаны.
5. Резервное копирование вне сайта
Чтобы выполнить правило резервного копирования 3-2-1, внешний сервер будет использовать rsync
для загрузки резервных копий с веб-сервера. Убедитесь, что и на веб-сервере, и на внешнем сервере установлен rsync
. Он установлен по умолчанию в системах Ubuntu и может быть установлен вручную с помощью:
$ sudo apt install rsync
Войдите на внешний сервер и создайте каталог для хранения резервных копий:
$ mkdir server_backup
Запустите rsync
, чтобы загрузить резервные копии с веб-сервера. Добавьте завершающий слеш после удаленного каталога, чтобы перенести только содержимое каталога.
$ rsync -azP --delete username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
rsync
принимает ряд аргументов:
a
- Архивировать, рекурсивно синхронизировать, сохраняя символические ссылки, разрешения файлов и т.д.z
- Сжимать данные файлов во время передачиP
- Сокращение от--partial
и--progress
, сохранять частично переданные файлы при прерывании и отображать ход передачи--delete
- Удалять посторонние файлы из целевого каталога
Будьте осторожны с
--delete
. Сначала протестируйте свою команду с опцией--dry-run
, чтобы предотвратить потерю данных.
Исключение файлов
Вы можете исключить файлы из rsync
. Чтобы исключить файл из передачи, используйте аргумент --exclude=relative/path/to/file/
в своей команде. Например, если вы хотите исключить резервную копию среды из передачи:
$ rsync -azP --delete --exclude=web-server.Wed.tar.gz username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Повторите --exclude=relative/path/to/file/
для каждого файла или каталога, которые вы хотите исключить.
Примечание: не включайте полный путь при указании того, что следует исключить, исключаемые пути должны быть относительными к исходному пути. Например, чтобы исключить резервную копию среды, хранящуюся в
/var/web_backup/daily/
, используйтеdaily/web-server.Wed.tar.gz
, а не/var/web_backup/daily/web-server.Wed.tar.gz
.
6. Вход в систему Rsync без пароля
Чтобы автоматизировать процесс, настройте rsync
для подключения к веб-серверу с внешнего сервера без пароля.
На внешнем сервере создайте пару ключей для rsync
:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
Назовите ключ id_rsa_rsync
и не вводите парольную фразу.
Добавьте новый открытый ключ на веб-сервер.
$ ssh-copy-id -i ~/.ssh/id_rsa_rsync username@remote_host
Внешний сервер должен иметь возможность загружать файлы с веб-сервера без пароля. На внешнем сервере проверьте команду.
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Если кто-то получит доступ к внешнему серверу, пара ключей предоставит ему доступ для входа на веб-сервер. Можно ограничить ключ и запретить удаленный вход.
Найдите точную команду, выполняемую на веб-сервере, с помощью grep
, включив подробный флаг -v
в ssh
.
$ rsync -azP --delete -e 'ssh -vi ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup 2>&1 | grep "Sending command"
Output:
debug1: Sending command: rsync --server --sender -vlogDtprz . /var/web_backup/
Подключитесь к веб-серверу по SSH и отредактируйте файл authorized_keys
:
$ sudo nano ~/.ssh/authorized_keys
Найдите открытый ключ, который вы добавили ранее. Например:
ssh-rsa AAAAB3Nza...[множество символов]...LiPk== user@example.com
Вставьте директиву команды перед ssh-rsa
, используя команду из шага 1. Строка будет выглядеть так, например:
command="rsync --server --sender -vlogDtprz . /var/web_backup/",no-pty,no-agent-forwarding,no-port-forwarding ssh-rsa AAAAB3Nza...[множество символов]...LiPk== user@example.com
Эта директива ограничивает ключ одной командой, снижая риск того, что злоумышленник может получить доступ к веб-серверу.
Проверьте команду rsync
с помощью ключа:
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Попробуйте войти с помощью ключа и убедитесь, что доступ для интерактивного входа запрещен.
$ ssh -i ~/.ssh/id_rsa_rsync username@remote_host
7. Автоматизируйте процесс
Откройте crontab
на сервере вне сайта.
$ sudo crontab -e
Добавьте команду rsync в конец файла.
00 03 * * * rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Это запланирует cron
для запуска команды rsync
в 03:00 каждый день.
Завершение
У вас есть рабочая стратегия резервного копирования 3-2-1! Автоматические резервные копии вашего веб-сайта создаются ежедневно и отправляются на удаленное местоположение с сохранением в течение одного года.
Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.