서버 관리 · 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 rsync

2 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 someuser

3 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_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

from= 뒤에 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"  
                ;;  
esac
chmod 700 ~/rsync/checkrsync

6 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 rsync

8 링크

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.