rsync · 6 min read · Dec 13, 2025

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

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

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

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

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

Как вы, возможно, уже догадались из того, что я написал до сих пор, концепция заключается в том, что мы инициируем зеркалирование 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 это выглядит так:

server1/mirror:

(Мы делаем это от имени root!)

apt install rsync

На других дистрибутивах Linux вы можете использовать yum / dnf (Fedora/CentOS) или yast (SuSE) для установки 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:

(Мы делаем это от имени root!)

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

Это создаст пользователя someuser с домашним каталогом /home/someuser и оболочкой для входа /bin/bash (важно, чтобы someuser имел действующую оболочку для входа - что-то вроде /bin/false не работает!). Теперь дайте someuser пароль:

passwd someuser

3 Протестируйте rsync

Далее мы тестируем rsync на mirror.example.com. Как root мы делаем это:

mirror:

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

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

Аутентичность хоста 'server1.example.com (192.168.0.100)' не может быть установлена.  
RSA ключ отпечатка: 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.  
Вы уверены, что хотите продолжить подключение (да/нет)?
<-- да

Затем введите пароль someuser, и вы должны увидеть, что каталог /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:

(Мы делаем это от имени root!)

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

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

Генерация пары открытых/закрытых ключей dsa.  
Введите пароль (пусто для отсутствия пароля): [нажмите enter здесь]  
Введите тот же пароль еще раз: [нажмите enter здесь]  
Ваша идентификация была сохранена в /root/cron/mirror-rsync-key.  
Ваш открытый ключ был сохранен в /root/cron/mirror-rsync-key.pub.  
Отпечаток ключа:  
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirror

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

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

mirror:

(Все еще делаем это от имени root.)

scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/someuser/

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

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

Теперь войдите через SSH на server1.example.com как someuser (не root!) и сделайте это:

server1:

(Пожалуйста, сделайте это как someuser!)

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:

(Все еще как someuser!)

vi /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:

(Все еще как someuser!)

vi /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:

(Мы все еще делаем это как someuser!)

mkdir ~/rsync  
vi ~/rsync/checkrsync
#!/bin/sh  
  
case "$SSH_ORIGINAL_COMMAND" in  
        *
*)  
                echo "Отклонено"  
                ;;  
        *
(*)  
                echo "Отклонено"  
                ;;  
        *
{*)  
                echo "Отклонено"  
                ;;  
        *
;*)  
                echo "Отклонено"  
                ;;  
        *
<*)  
                echo "Отклонено"  
                ;;  
        *
`*)  
                echo "Отклонено"  
                ;;  
        rsync
 --server*)  
                $SSH_ORIGINAL_COMMAND  
                ;;  
        *)  
                echo "Отклонено"  
                ;;  
esac
chmod 700 ~/rsync/checkrsync

6 Протестируйте rsync на mirror.example.com

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

mirror:

(Мы делаем это от имени root!)

rsync -avz --delete --exclude=/stats --exclude=/error --exclude=/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/

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

man rsync

для получения дополнительной информации.)

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

получение списка файлов ... готово  
  
отправлено 71 байт  получено 643 байта  476.00 байт/сек  
общий размер 64657  ускорение 90.56

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

7 Создайте cron job

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

mirror:

(Мы делаем это от имени root!)

crontab -e

и создайте cron job, как этот:

*/5 * * * * /usr/bin/rsync -azq --delete --exclude=/stats --exclude=/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/ 

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

man 5 crontab

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

mirror:

(Мы делаем это от имени root!)

which rsync

чтобы узнать, где ваш.

8 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.