서버 관리 · 5 min read · Oct 08, 2025
완벽한 로드 밸런스 및 고가용성 웹 클러스터: 우분투 8.04 하디 헤론에서 Xen을 실행하는 2대 서버 - 8페이지
14. rsync로 웹 및 메일 파일 미러링 (web1, web2)
이 부분은 까다롭습니다. 클러스터에 배치할 웹사이트의 유형에 따라 웹 파일을 미러링하는 데 사용되는 기술이 다를 수 있습니다.
web1.example.com을 마스터로 간주하고, web2.example.com은 web1.example.com과 동기화됩니다.
이로 인해 일부 경우에 문제가 발생할 수 있습니다. 사용자가 파일을 업로드할 수 있는 웹사이트가 있는 경우, 두 서버가 동기화되지 않기 때문에 web2.example.com에 업로드되기를 원하지 않습니다.
제 경우에는 사용자가 데이터를 업로드할 수 있는 모든 페이지를 HTTP 포트 81로 리디렉션하여 단일 서버인 web1.example.com으로만 전달됩니다. 마스터 서버가 실패하면 모든 포트 81 트래픽이 대체 서버인 web2.example.com으로 전달되고 미러링은 일시적으로 중단됩니다.
리디렉션은 apache vhost.conf에서 다음과 같이 수행할 수 있습니다:
[...]
Redirect /admin http://www.example.com:81/webmail
[...]사용자에 의해 많은 파일 업로드가 이루어지는 경우 로드 밸런스 NFS 사용을 고려할 수 있습니다:
https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat
14.1 rsync 설치
apt-get install rsync
14.2 web2.example.com에서 키 생성
이제 web2.example.com에서 개인/공개 키 쌍을 생성합니다:
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): [여기서 엔터를 누르세요]
Enter same passphrase again: [여기서 엔터를 누르세요]
Your identification has been saved in /root/rsync/mirror-rsync-key.
Your public key has been saved in /root/rsync/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@web2비밀번호를 입력하지 않는 것이 중요합니다. 그렇지 않으면 미러링이 사람의 상호작용 없이 작동하지 않으므로 단순히 엔터를 누르세요!
다음으로, 공개 키를 web1.example.com으로 복사합니다:
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/vmail/
공개 키 mirror-rsync-key.pub는 이제 web1.example.com의 /home/vmail에 있어야 합니다.
14.3 web1.example.com 구성
web1.example.com
이제 vmail로 SSH를 통해 로그인하고 다음을 수행합니다:
login vmail
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/vmail/.ssh/authorized_keys 파일에 추가됩니다. /home/vmail/.ssh/authorized_keys는 다음과 비슷해야 합니다:
(여전히 webmaster로 web1.example.com에서 작업 중입니다)
vi ~/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@web2이제 web2.example.com에서만 연결을 허용하고 연결하는 사용자가 rsync만 사용할 수 있도록 하려면 다음을 추가합니다:
command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty/home/vmail/.ssh/authorized_keys의 시작 부분에:
command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
web2이제 web1.example.com에서 rsync를 제외한 모든 명령을 거부하는 스크립트 /home/vmail/rsync/checkrsync를 생성합니다.
(여전히 vmail로 작업 중입니다!)
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/checkrsync
14.4 자동화된 rsync 테스트
web2.example.com
먼저 rsync에 어떤 파일을 동기화하지 않을지 알려야 합니다(예: munit 그래프!).
vi /root/exclude_www.txt
다음과 같이 만듭니다:
/example/web/monit/
/example/web/monitoring/
/example/ssl/
/yoursite/ssl/ 이제 메일에 대해:
vi /root/exclude_mail.txt
/rsync/
/.ssh/
#if you use my monitoring script, see next page
server1_was_down/
.bash_history/
.bash_logout/
.bashrc/
.mysql_history/
.profile/
.viminfo/이제 web2.example.com에서 web1.example.com을 비밀번호 입력 없이 미러링할 수 있는지 테스트해야 합니다. 우리는 이렇게 합니다:
(우리는 root로 작업합니다!)
web2.example.com
rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_www.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/var/www/ /var/www/
다음으로:
rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_mail.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/home/vmail/ /home/vmail/
이제 비밀번호 입력 없이 미러링이 이루어지는 것을 볼 수 있어야 합니다:
receiving file list ... done
sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.5614.5 크론 작업 생성
먼저 웹1.example.com이 어떤 이유로 다운되면 rsync가 중지되고 root가 수동으로 프로세스를 다시 시작해야 한다는 것을 보장하는 스크립트를 생성합니다.
이렇게 해야 하는 이유는 web2.example.com이 다운되면 메일을 위해 web1.example.com을 인계받기 때문입니다. 그 기간 동안 새로운 메일은 web2.example.com에서 수신되므로, 예를 들어 web1.example.com이 1시간 후에 다시 온라인 상태가 되면, 그 기간 동안의 모든 새로운 메일은 rsync –delete 명령으로 인해 web2.example.com에서 삭제됩니다. 아래에서 이러한 경우 두 서버를 다시 동기화하는 방법을 살펴보겠습니다.
지금은 그 스크립트를 작성해 봅시다.
web2.example.com에서
vi /root/rsync_web1
#!/bin/bash
# 2개의 로드 밸런스 서버 간의 웹 데이터 및 메일을 rsync하는 스크립트
# Copyright (c) 2008 blogama.org
# 이 스크립트는 GNU GPL 버전 2.0 이상에 따라 라이센스가 부여됩니다.
# ---------------------------------------------------------------------
### 이 스크립트는 2가지 목적이 있습니다 ###
### 1) 마스터 서버에 대한 포트 25에서 연결 확인 후 메일을 rsync합니다 ###
### 2) 마스터 서버에 대한 포트 80에서 연결 확인 후 www 데이터를 rsync합니다 ###
### 수정해야 할 사항 ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"
###### 아래는 수정하지 마십시오 ######
### 바이너리 ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### 문제 해결 후 원래 상태로 복원하기 위해 ###
if [ $1 ]; then
if [ $1=="fix" ]; then
if [ -f smtp_down.txt ]; then
rm /root/smtp_down.txt
fi
if [ -f www_down.txt ]; then
rm /root/www_down.txt
fi
fi
fi
####################SMTP####################
### SMTP 문제에 대해 이미 알림을 보냈다면 종료 ###
cd /root
if [ -f smtp_down.txt ]; then
exit 1;
fi
### 서버 1이 SMTP에서 응답하는지 확인합니다. 응답하면 메일을 rsync합니다 ###
### 서버 1이 다운된 경우 서버 2와 --delete로 rsync할 수 없습니다 ###
### 서버 1과 2를 다시 동기화해야 합니다(삭제 없음) 및 /root/sync fix 실행 ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $SMTPPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
$RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_mail.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $MAILRSYNCUSER@$MASTERSERVERIP:$MAILDIR $MAILDIR
else
echo "서버 1이 다운되었습니다. 메일 동기화가 더 이상 작동하지 않습니다" > /root/smtp_down.txt
$MAIL -s "서버 1 다운 포트 25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### HTTP 문제에 대해 이미 알림을 보냈다면 종료 ###
cd /root
if [ -f http_down.txt ]; then
exit 1;
fi
### 서버 1이 HTTP에서 응답하는지 확인합니다. 응답하면 www 데이터를 rsync합니다 ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $WEBPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
$RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_www.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $WWWRSYNCUSER@$MASTERSERVERIP:$WWWDIR $WWWDIR
else
echo "서버 1이 다운되었습니다. WWW 동기화가 더 이상 작동하지 않습니다" > /root/http_down.txt
$MAIL -s "서버 1 다운 포트 80" $EMAIL < /root/http_down.txt
fi이 파일을 실행 가능하게 만듭니다:
chmod +x /root/rsync_web1
물론 이 파일에 원하는 내용을 넣을 수 있습니다 ;) 슬래시를 넣지 않으면 키워드를 재귀적으로 무시합니다(예: *.gz), 슬래시를 넣으면 특정 위치에 대한 것입니다(예: /example/ssl/).
이제 다음을 수행하여 스크립트를 크론탭에 추가합니다:
crontab -e
그리고 다음 줄을 추가합니다:
[...]
*/5 * * * * /root/rsync_web1 >/dev/null 2>&1
[...]이렇게 하면 5분마다 실행됩니다. 물론 필요에 따라 변경할 수 있습니다.
14.6 web1.example.com이 다운된 경우
일반적으로 web1.example.com이 다운된 경우 다음을 수행해야 합니다:
- –delete 명령 없이 WEB1에서 WEB2로 rsync:
web1.example.com
rsync -avz [email protected]:/var/www/ /var/www/
rsync -avz [email protected]:/home/vmail/ /home/vmail/
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.