Зеркалирование 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
Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.
Вдохновлен www.howtoforge.com
Комментарии (0)