Зеркалирование web-сайта с помощью rsync

Это руководство показывает, как можно зеркалировать ваш веб-сайт с основного веб-сервера на резервный сервер, который может взять на себя управление в случае сбоя основного сервера. Для этого мы используем инструмент rsync, и мы заставляем его работать через задание cron, которое проверяет каждые x минут, есть ли что-то, что нужно обновить на зеркале. Таким образом, ваш резервный сервер обычно должен быть в актуальном состоянии, если ему придется взять на себя управление.

rsync обновляет только файлы, которые изменились, поэтому вам не нужно передавать 5 ГБ данных каждый раз, когда вы запускаете rsync. Он зеркалирует только новые/измененные файлы, а также может удалять с зеркала файлы, которые были удалены на основном сервере. Кроме того, он может сохранять разрешения и права собственности на зеркалированные файлы и каталоги. Чтобы сохранить права собственности, нам нужно запустить rsync от имени root, что мы и делаем в данном случае. Если разрешения и права собственности изменятся на основном сервере, rsync также изменит их на резервном сервере.

В этом руководстве мы будем туннелировать rsync через SSH, что более безопасно; это также означает, что вам не нужно открывать еще один порт в вашем брандмауэре для rsync – достаточно, если порт 22 (SSH) будет открыт. Проблема в том, что SSH требует пароля для входа в систему, что не очень хорошо, если вы хотите запускать rsync как задание cron. Необходимость в пароле требует взаимодействия с человеком, а это не то, чего мы хотим.

Но, к счастью, есть решение: использование открытых ключей. Мы создаем пару ключей (на нашем сервере резервного копирования mirror.itshaman.onmypc.net), один из которых сохраняется в файле на удаленной системе (itshaman.onmypc.net). После этого при запуске rsync у нас больше не будет запрашиваться пароль. Это также работает через cron, что нам и нужно.

Как вы уже догадались из того, что я написал, концепция заключается в том, что мы инициируем зеркалирование server1.example.com _ непосредственно с _mirror.example.com; _server1.example.com _ не должен ничего делать, чтобы получить зеркалирование.

Я буду использовать следующую установку здесь:

  • Главный сервер: server1.example.com (server1) – IP-адрес: 192.168.0.100
  • Зеркальный/резервный сервер: mirror.example.com (mirror) – IP-адрес: 192.168.0.175
  • Сайт, который будет зеркалироваться, находится в /var/www на server1.example.com.

rsync предназначен только для зеркалирования файлов и каталогов; если вы хотите зеркалировать базу данных MySQL, используйте зеркалирование/репликацию MySQL. В этой статье не про нее.

Прежде всего, я хочу сказать, что это не единственный способ создания такой системы. Существует много способов достижения этой цели, но я буду использовать именно такой способ.

Первым шагом будет вход в систему или получение статуса пользователя root в вашей системе. В Debian и centOS используйте:

su -

Если вы вошли в систему под пользователем, отличным от root. В Ubuntu используйте:

sudo -s

1. Установка rsync

Сначала нам нужно установить rsync на server1.example.com и mirror.example.com. Для систем Debian и Ubuntu это выглядит так:

apt install rsync

В CentOS / Rocky Linux или AlmaLinux используйте:

dnf install rsync

2 Создание непривилегированного пользователя на server1.example.com

Сейчас мы создадим непривилегированного пользователя someuser на server1.example.com, который будет использоваться rsync на mirror.example.com для зеркалирования каталога /var/www (конечно, someuser должен иметь права на чтение /var/www на server1.example.com).

server1:

sudo useradd -d /home/someuser -m -s /bin/bash someuser

Это создаст пользователя someuser с домашним каталогом /home/someuser и оболочкой входа /bin/bash. Теперь дайте someuser пароль:

passwd someuser

3 Тест rsync

Следующим шагом мы протестируем rsync на mirror.example.com. От имени root делаем следующее:

mirror:

rsync -avz -e ssh [email protected]:/var/www/ /var/www/

Вы должны увидеть что-то вроде этого. Ответьте «да»:

The authenticity of host 'server1.example.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?
<-- yes

Затем введите пароль пользователя, и вы увидите, что каталог /var/www сервера server1.example.com зеркалируется в /var/www на mirror.example.com.

Вы можете проверить это следующим образом на обоих серверах:

server1/mirror:

ls -la /var/www

Вы должны увидеть, что все файлы и каталоги были зеркалированы на mirror.example.com, и файлы и каталоги должны иметь те же права доступа/владения, что и на server1.example.com.

4 Создание ключей на mirror.example.com

Сейчас мы создаем пару закрытый/открытый ключ на mirror.example.com:

mirror:

mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key

Вы увидите что-то вроде этого:

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /root/cron/mirror-rsync-key.
Your public key has been saved in /root/cron/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirror

Важно, чтобы вы не вводили кодовую фразу, иначе зеркалирование не будет работать без участия человека, поэтому просто нажмите enter!

Следующим шагом мы копируем наш открытый ключ на server1.example.com:

mirror:

scp /root/rsync/mirror-rsync-key.pub someuser@server1.example.com:/home/someuser/

Общий ключ mirror-rsync-key.pub теперь должен быть доступен в /home/someuser на server1.example.com.

5 Настройка server1.example.com

Сейчас войдите по SSH на server1.example.com как someuser (не root!) и сделайте следующее:

server1:

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keys

Сделав это, мы добавили содержимое файла mirror-rsync-key.pub в файл /home/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys должен выглядеть примерно так:

server1:

nano /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@mirror

Сейчас мы хотим разрешить соединения только с mirror.example.com, и подключающемуся пользователю должно быть разрешено использовать только rsync, поэтому мы добавим

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty

прямо в начало /home/someuser/.ssh/authorized_keys:

server1:

nano /home/someuser/.ssh/authorized_keys
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@mirror

Вы должны использовать FQDN, например mirror.example.com, вместо IP-адреса после from=, иначе автоматическое зеркалирование не будет работать!

Теперь мы создаем скрипт /home/someuser/rsync/checkrsync, который отклоняет все команды, кроме rsync.

server1:

mkdir ~/rsync
nano ~/rsync/checkrsync
#!/bin/sh

case «$SSH_ORIGINAL_COMMAND» in
        \&)
                echo «Rejected»
                ;;
        \()
                echo «Rejected»
                ;;
        \{)
                echo «Rejected»
                ;;
        \;)
                echo «Rejected»
                ;;
        \<)
                echo «Rejected»
                ;;
        \`)
                echo «Rejected»
                ;;
        rsync\ —server*)
                $SSH_ORIGINAL_COMMAND
                ;;
        *)
                echo «Rejected»
                ;;
esac
chmod 700 ~/rsync/checkrsync

6 Тест rsync на mirror.example.com

Теперь мы должны проверить на mirror.example.com, можем ли мы зеркалировать server1.example.com без запроса пароля someuser. Делаем так:

mirror:

rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" someuser@server1.example.com:/var/www/ /var/www/

Опция --delete означает, что файлы, которые были удалены на server1.example.com, должны быть удалены и на mirror.example.com. Опция --exclude означает, что эти файлы/каталоги не должны быть зеркалированы; например, --exclude=**/error означает «не зеркалировать /var/www/error». Вы можете использовать несколько опций --exclude. Я привел эти параметры в качестве примера; вы можете настроить команду в соответствии со своими потребностями. Посмотрите

man rsync

Вы должны увидеть, что зеркалирование происходит:

receiving file list ... done
sent 71 bytes  received 643 bytes  476.00 bytes/sec
total size is 64657  speedup is 90.56

без запроса пароля! Это то, что мы хотели.

7 Создание задания Cron

Мы хотим автоматизировать зеркалирование, поэтому создадим для него задание cron на сайте mirror.example.com. Запустите crontab -e от имени root:

mirror:

crontab -e

и создайте следующее задание cron:

*/5 * * * * /usr/bin/rsync -azq --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" someuser@server1.example.com:/var/www/ /var/www/ 

Это будет запускать rsync каждые 5 минут; настройте его под свои нужды (см.

man 5 crontab

Я использую здесь полный путь к rsync (/usr/bin/rsync), чтобы убедиться, что cron знает, где найти rsync. Ваше расположение rsync может отличаться. Выполните

mirror:

which rsync

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен www.howtoforge.com

Похожие статьи

Комментарии (0)