우분투 실전 명령어 | rsync로 서버 파일 동기화/백업

언제 쓰는가

서버 간에 파일을 옮길 때 scp만 쓰면 매번 전체를 다시 보내서 오래 걸릴 때가 많습니다.
rsync는 변경된 부분만 전송해서 배포, 로그 백업, 정적 파일 동기화 같은 반복 작업에 특히 유리합니다.
네트워크가 불안정한 환경에서도 이어받기(--partial)와 압축(-z)을 조합하면 훨씬 안정적으로 운영할 수 있습니다.

바로 쓰는 명령어

# 로컬 디렉터리를 원격 서버로 동기화
rsync -avz --delete ./dist/ [email protected]:/var/www/app/

# 원격 로그를 로컬 백업 디렉터리로 가져오기
rsync -avz [email protected]:/var/log/nginx/ ./backup/nginx/
# 대역폭 제한 + 중단 대비
rsync -avz --partial --bwlimit=5000 ./archive/ [email protected]:/data/archive/

# 전송 전에 어떤 파일이 바뀌는지 미리 보기
rsync -avzn --delete ./dist/ [email protected]:/var/www/app/

자주 하는 실수

  • --delete를 검증 없이 바로 쓰는 실수
    • 대상 경로 오타가 있으면 원격 파일이 대량 삭제될 수 있습니다. 먼저 -n(dry-run)으로 결과를 확인하세요.
  • 경로 끝 슬래시(/) 의미를 헷갈리는 실수
    • ./dist./dist/는 동작이 다릅니다. 보통 “디렉터리 내용”만 동기화하려면 끝 슬래시를 붙입니다.
  • SSH 포트를 바꿔 둔 서버에서 기본 포트(22)로 시도하는 실수
    • 연결이 안 되면 -e "ssh -p 2222"처럼 명시해야 합니다.

검증 방법

# 동기화 후 파일 개수/용량 비교
find ./dist -type f | wc -l
ssh [email protected] 'find /var/www/app -type f | wc -l'

# 특정 파일 해시 비교
sha256sum ./dist/main.js
ssh [email protected] 'sha256sum /var/www/app/main.js'
# 최근 전송 로그 확인
rsync -avz --itemize-changes ./dist/ [email protected]:/var/www/app/

실행 결과 예시

$ rsync -avzn --delete ./dist/ [email protected]:/var/www/app/
sending incremental file list
./
index.html
assets/app.3f2a1c.js

total size is 8,421,992  speedup is 143.77 (DRY RUN)
$ rsync -avz --itemize-changes ./dist/ [email protected]:/var/www/app/
sending incremental file list
>f.st...... index.html
>f+++++++++ assets/app.3f2a1c.js

sent 412,918 bytes  received 2,104 bytes  276,681.33 bytes/sec
total size is 8,421,992  speedup is 20.26

출처

  • Ubuntu Manpages
  • GNU rsync Documentation
  • OpenSSH Manual