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 rsync2 Создайте непривилегированного пользователя на 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 someuser3 Протестируйте 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_keysssh-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_keyscommand="/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 "Отклонено"
;;
esacchmod 700 ~/rsync/checkrsync6 Протестируйте 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 Ссылки
- rsync: https://rsync.samba.org/
Get new posts in your inbox
No spam. Unsubscribe anytime.