서버 관리 · 5 min read · Dec 13, 2025
웹 사이트를 rsync로 미러링하기

이 튜토리얼에서는 주요 웹 서버에서 백업 서버로 웹 사이트를 미러링하는 방법을 보여줍니다. 백업 서버는 주요 서버가 실패할 경우 인계받을 수 있습니다. 이를 위해 rsync 도구를 사용하며, 미러링할 내용이 있는지 매 x 분마다 확인하는 cron 작업을 통해 실행합니다. 따라서 백업 서버는 인계받아야 할 경우 보통 최신 상태여야 합니다.
rsync는 변경된 파일만 업데이트하므로, rsync를 실행할 때마다 5GB의 데이터를 전송할 필요가 없습니다. 새로운/변경된 파일만 미러링하며, 주요 서버에서 삭제된 파일을 미러에서 삭제할 수도 있습니다. 또한 미러링된 파일과 디렉토리의 권한과 소유권을 보존할 수 있습니다. 소유권을 보존하려면 root로 rsync를 실행해야 하며, 여기서 그렇게 합니다. 주요 서버에서 권한 및/또는 소유권이 변경되면, rsync는 백업 서버에서도 이를 변경합니다.
이 튜토리얼에서는 rsync를 SSH를 통해 터널링할 것입니다. 이는 더 안전하며, rsync를 위해 방화벽에서 다른 포트를 열 필요가 없음을 의미합니다. 포트 22(SSH)만 열려 있으면 충분합니다. 문제는 SSH가 로그인 시 비밀번호를 요구하는데, 이는 rsync를 cron 작업으로 실행하려는 경우 좋지 않습니다. 비밀번호 요구는 인간의 상호작용을 필요로 하며, 이는 우리가 원하는 것이 아닙니다.
하지만 다행히도 해결책이 있습니다: 공개 키의 사용입니다. 우리는 키 쌍을 생성합니다(백업 서버 mirror.example.com에서), 그 중 하나는 원격 시스템(server1.example.com)의 파일에 저장됩니다. 이후 rsync를 실행할 때 더 이상 비밀번호를 입력하라는 메시지가 표시되지 않습니다. 이는 cron 작업에도 포함되며, 우리가 원하는 것입니다.
제가 지금까지 쓴 내용을 통해 이미 짐작하셨겠지만, 개념은 mirror.example.com에서 직접 server1.example.com의 미러링을 시작하는 것입니다. server1.example.com은 미러링을 위해 아무것도 할 필요가 없습니다.
다음과 같은 설정을 사용할 것입니다:
- 주요 서버: server1.example.com (server1) - IP 주소: 192.168.0.100
- 미러/백업 서버: mirror.example.com (mirror) - IP 주소: 192.168.0.175
- 미러링할 웹 사이트는 server1.example.com의 /var/www에 있습니다.
rsync는 파일과 디렉토리만 미러링하는 데 사용됩니다. MySQL 데이터베이스를 미러링하려면 MySQL 미러링/복제를 사용하십시오.
먼저 말씀드리고 싶은 것은, 이러한 시스템을 설정하는 유일한 방법이 아니라는 것입니다. 이 목표를 달성하는 방법은 여러 가지가 있지만, 제가 선택할 방법은 이 방법입니다.
첫 번째 단계는 시스템에 로그인하거나 root 사용자로 전환하는 것입니다. Debian 및 centOS에서는 다음과 같이 합니다:
su -root가 아닌 다른 사용자로 로그인한 경우. Ubuntu에서는 다음을 사용합니다:
sudo -s대신 사용하십시오.
1 rsync 설치하기
먼저, server1.example.com과 mirror.example.com 모두에 rsync를 설치해야 합니다. Debian 및 Ubuntu 시스템에서는 다음과 같이 보입니다:
server1/mirror:
(우리는 root로 이 작업을 수행합니다!)
apt install rsync다른 리눅스 배포판에서는 yum / dnf(Fedora/CentOS) 또는 yast(SuSE)를 사용하여 rsync를 설치합니다.
CentOS / Rocky Linux 또는 AlmaLinux에서는 다음을 사용합니다:
dnf install rsync2 server1.example.com에 비특권 사용자 생성하기
이제 server1.example.com에 rsync가 mirror.example.com에서 /var/www 디렉토리를 미러링하는 데 사용할 비특권 사용자 someuser를 생성합니다(물론 someuser는 server1.example.com의 /var/www에 대한 읽기 권한이 있어야 합니다).
server1:
(우리는 root로 이 작업을 수행합니다!)
sudo useradd -d /home/someuser -m -s /bin/bash someuser이 명령은 /home/someuser 홈 디렉토리와 /bin/bash 로그인 셸을 가진 someuser 사용자를 생성합니다(사용자 someuser가 유효한 로그인 셸을 가져야 합니다 - /bin/false와 같은 것은 작동하지 않습니다!). 이제 someuser에게 비밀번호를 설정합니다:
passwd someuser3 rsync 테스트하기
다음으로, mirror.example.com에서 rsync를 테스트합니다. root로 다음을 수행합니다:
mirror:
rsync -avz -e ssh [email protected]:/var/www/ /var/www/다음과 같은 메시지가 표시되어야 합니다. yes로 응답하십시오:
'서버1.example.com (192.168.0.100)'의 신뢰성이 확인되지 않았습니다.
RSA 키 지문은 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23입니다.
계속 연결하시겠습니까 (yes/no)?<-- yes그런 다음 someuser의 비밀번호를 입력하면 server1.example.com의 /var/www 디렉토리가 mirror.example.com의 /var/www에 미러링되는 것을 볼 수 있습니다.
다음과 같이 두 서버에서 확인할 수 있습니다:
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 키 쌍을 생성하는 중입니다.
비밀번호를 입력하십시오(비밀번호 없음): [여기서 엔터를 누르십시오]
같은 비밀번호를 다시 입력하십시오: [여기서 엔터를 누르십시오]
귀하의 식별 정보는 /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는 이제 server1.example.com의 /home/someuser에 있어야 합니다.
5 server1.example.com 구성하기
이제 someuser(루트가 아님)로 server1.example.com에 SSH를 통해 로그인하고 다음을 수행합니다:
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@
mirrorfrom= 뒤에 IP 주소 대신 mirror.example.com과 같은 FQDN을 사용해야 합니다. 그렇지 않으면 자동 미러링이 작동하지 않습니다!
이제 모든 명령을 rsync를 제외하고 거부하는 스크립트 /home/someuser/rsync/checkrsync를 생성합니다.
server1:
(여전히 someuser로 이 작업을 수행합니다!)
mkdir ~/rsync
vi ~/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"
;;
esacchmod 700 ~/rsync/checkrsync6 mirror.example.com에서 rsync 테스트하기
이제 mirror.example.com에서 someuser의 비밀번호를 입력하라는 메시지 없이 server1.example.com을 미러링할 수 있는지 테스트해야 합니다. 다음을 수행합니다:
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 작업 생성하기
미러링을 자동화하고 싶으므로 mirror.example.com에서 cron 작업을 생성합니다. root로 crontab -e를 실행합니다:
mirror:
(우리는 root로 이 작업을 수행합니다!)
crontab -e다음과 같은 cron 작업을 생성합니다:
*/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 rsync8 링크
- rsync: https://rsync.samba.org/
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.