Profile picture

[Linux] Ubuntu 22.04에서 미러(Mirror) 서버 구축하는 방법

JaehyoJJAng2024년 12월 18일

개요

오늘 게시글에서는 22.04 서버에서 미러 서버를 운영하는 방법에 대해서 기록해보려고 합니다.

미러 서버는 현재 다양한 용도로 사용되고 있어요.


내부망에서 사용하기 위한 비공개 미러 와 커뮤니티에 공유하여 많은 사람들이 이용할 수 있도록 하는 공개 미러 가 있죠.

이번 포스팅에서는 두 상황에서 모두 사용 가능한 방법으로 미러를 구축해보려고 합니다.


미러 서버란 무엇일까?

미러 서버는 원본 서버의 데이터를 복제해서 사용자에게 제공하는 서버에요.

예를 들어, Proxmox 공식 서버에서 ISO 파일이나 패키지를 내려받아 로컬 서버에 저장한 뒤, 이를 다른사람들에게 배포하는 방식이죠!


예를 들어볼까요?

Ubuntu를 설치하기 위해서는 iso 파일을 다운로드 받아야 해요.

iso 파일은 당연히 우분투 공식 홈페이지에 있구요.
image
여기서 다운로드 버튼을 클릭하면 우분투 사이트에서는 사용자의 접속 국가를 기반으로 우분투 공식 미러로 등록된 사이트 중 한국 서버 아무 곳으로 보내 다운로드 하도록 처리됩니다.


왜 이런 방식으로 다운로드 되는가?

보통 해외에 서버를 두고 있는 오픈소스 프로젝트나 기타 프로젝트의 경우

패키지 파일이나, 기타 설치 파일 등을 받을 때 다운로드 속도가 상당히 느린 것을 경험해본 적이 있을거에요!


그 이유는 여러 국가의 인터넷 회선을 거쳐 목적지 서버에 도달하기 때문에 느려지기 때문이에요.

조금 더 극단적인 예를 들면, 하나의 파일을 다운로드 받는데 걸리는 시간이 1시간이 넘게 걸릴 수도 있는거죠.


이러한 문제를 해결하기 위해,

국내에 서버를 두고 해당 서버가 원본 서버에 있는 모든 파일을 다 받아서 파일을 뿌려주도록 하는거에요.

이렇게 하면 국내에 있는 인터넷 망을 통해 빠른 속도로 파일을 받아갈 수 있겠죠?


이러한 이점 때문에 우분투에서는 커뮤니티 미러를 허용해서 자신들의 기준에 충족되면 공식 미러로 인정해주게 되고,

사람들의 다운로드 요청을 해당 미러(국내 미러)들로 보내 빠르게 받아갈 수 있도록 합니다!



미러 서버를 위한 준비가 어떻게 되나요?

이 문서에서 기준으로 하는 운영체제는 Ubuntu 22.04를 기준으로 합니다.

그 외 배포판의 경우에도 명령어가 크게 달라지지는 않아요.


미러 서비스를 하려면 다음과 같은 조건이 충족되어야 합니다.

저장 공간

  • 대략 1TB ~ 5TB 정도의 여유 공간이 있으면 좋아요!
  • Proxmox 미러는 약 600GB 정도의 공간이 필요해요.
  • Rocky 미러는 약 1.2TB 정도 공간을 요구해요.

하드웨어

  • 4코어 이상의 CPU를 권장합니다.
  • RAM은 8GB 이상을 권장합니다.
  • GPU는 필요하지 않아요.
  • HDD/SSD 모두 가능합니다
    • HDD의 경우 NAS용 HDD를 사용해주세요.
    • 미러 서버를 공개형으로 사용하는 경우, 하드의 읽기/쓰기가 매우 활발하게 일어나므로 일반 HDD 사용 시 치명적인 상황을 겪게될 수도 있어요.

네트워크

  • 최소: 120Mbps 이상의 인터넷 회선을 사용해주세요.
  • 권장: 500Mbps 이상의 인터넷 회선을 사용해주세요.

미러 서버 본격적으로 구축해보기

1. 서버 준비

Ubuntu 22.04 서버가 준비되어 있어야겠죠?

준비 되었다면 최신 상태로 업데이트 해줍시다.

sudo apt update && sudo apt upgrade -y

업데이트가 끝났다면 각종 필수 패키지를 설치해주세요.

sudo apt install rsync wget curl nginx -y

그리고 원본 서버로부터 복제한 데이터를 저장할 폴더를 생성해줄게요.

mkdir -p /mirror/proxmox/iso

2. 데이터 동기화

주기적으로 원본 서버로부터 최신 데이터를 받아와야 해요!


저는 Proxmox ISO를 가져오기 위해 wget 모듈을 사용해보려고 해요!

또한 데이터를 동기화하는 작업을 쉘 스크립트로 작성해 볼 겁니다!


참고로 데이터를 동기화할 때 rsync / wget 두 가지 방법을 사용해서 동기화해 볼 수 있는데요!


Proxmox의 경우에는 미러 서버에서 Rsync를 지원하지 않아서 rsync로 데이터를 동기화할 수 없었는데요!

그래서 wget을 사용해서 데이터를 동기화하는 방법에 대해서 중점적으로 정리해봤습니다.

rsync 방법도 정리하였으니 환경에 맞게 참고해보세요.


wget

전체 코드

#!/usr/bin/bash

# 기본 변수 설정
SyncBase="http://download.proxmox.com" # Proxmox mirror page
baseDIR="/mirror/proxmox" # 미러 데이터를 저장할 부모 디렉토리

# 디렉토리 확인 및 생성
if [ ! -d "$baseDIR" ]; then
    echo "$baseDIR 존재하지 않습니다. 폴더를 생성합니다."
    mkdir -p "$baseDIR" || { echo "폴더 생성 실패!"; exit 1; }
fi

# 다운로드할 하위 디렉토리 목록
folders=("iso" "debian" "images")

# 각 폴더를 순회하며 다운로드
for folder in "${folders[@]}"; do
    target_dir="$baseDIR/$folder"
    mkdir -p "$target_dir"
    
    echo "다운로드 중: $SyncBase/$folder -> $target_dir"
    wget -r -np -nH --cut-dirs=1 -P "$target_dir" -R "index.html*" "$SyncBase/$folder/"
done

echo "미러링 완료!"


rsync

전체 코드

#!/usr/bin/bash

SyncSource="rsync://download.proxmox.com"
baseDIR="/mirror/proxmox"

if [ ! -d "$baseDIR" ]; then
        echo "$baseDIR 존재하지 않습니다. 폴더를 생성합니다."
        mkdir -p "$baseDIR" || echo "폴더 생성 실패!"; exit 1
fi

rsync --verbose --recursive --times --links --safe-links --hard-links \
        --stats --delete-after \
        $SyncSource $baseDIR || echo "Failed to rsync from $SyncSource."
date -u > "$baseDIR/.trace/$(hostname -f)"

Rsync 명령어 정리

  • rsync: 파일 동기화를 위한 도구입니다. 여기서 사용된 옵션들을 하나씩 설명하겠습니다!
    • --verbose: 진행 상황을 자세히 출력합니다(상태 메시지 확인 가능).
    • --recursive: 하위 디렉토리까지 재귀적으로 동기화합니다.
    • --times: 파일의 수정 시간을 유지합니다.
    • --links: 심볼릭 링크를 그대로 보존합니다.
    • --safe-links: 외부로 연결된 심볼릭 링크는 무시해 보안을 강화합니다.
    • --hard-links: 하드 링크를 유지합니다(동일한 파일의 여러 참조를 보존).
    • --stats: 동기화 후 통계 정보를 출력합니다(전송된 파일 수 등).
    • --delete-after: 소스에 없는 파일을 대상에서 삭제합니다(동기화 후 실행).
  • $SyncSource $baseDIR: 소스(rsync://download.proxmox.com/iso)에서 대상(mirror/proxmox/iso)로 데이터를 전송합니다.
  • || echo "Failed to rsync from $SyncSource.": rsync가 실패하면 오류를 보고하고 종료합니다.


cron 설정

그리고 주기적으로 데이터를 동기화하기 위해서 cron을 설정해 볼건데요!


그 전에 스크립트에 실행 권한을 부여해줄게요!

chmod u+x /mirror/sync.sh

마지막으로 매일 새벽 3시에 자동으로 동기화되도록 cron도 아래와 같이 설정해볼게요.

crontab -e
# 추가
0 3 * * * bash /mirror/sync.sh 1>/dev/null 2>&1

3. 웹 서버 설정

이제 Nginx를 설치하고 미러 데이터를 제공할 준비를 해줄게요!

sudo apt install nginx -y

Nginx 설정 파일을 만들어 디렉토리 목록을 표시하도록 설정할게요.


참고로 nginx-extra를 설치해서 사용 중이라면 /etc/nginx/conf.d/default.conf 파일을 수정해주면 됩니다.


/etc/nginx/sites-available/default

server {
        listen 80;
        listen [::]:80;

        server_name mirror.example.com;
        root /mirror/output/;

        location / {
        }

        location /proxmox {
                alias /mirror/proxmox/;
                fancyindex on;
                fancyindex_exact_size off;
                fancyindex_localtime on;
                fancyindex_header "/theme/header.html";
                fancyindex_footer "/theme/footer.html";
        }
}

/mirror/output 디렉토리는 커스텀된 index.html 파일이 존재하는 경로예요!

사용자에게 조금 더 친화적인 미러 페이지를 제공하기 위해서 오픈 소스를 사용하였습니다.
Image
<오픈소스 원작자 깃허브>


그리고 nginx-extra를 사용하지 않는 분들은 fancyindex 부분을 지우고 사용해주시면 됩니다!



설정을 활성화하고 Nginx를 재시작해요!

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
sudo systemctl restart nginx

4. 방화벽 오픈

방화벽을 사용하는 환경이라면 HTTP 포트를 오픈해줘야겠죠?

sudo ufw allow 80
sudo ufw enable

5. 테스트

브라우저에서 http://<서버_IP>로 접속해서 ISO 파일이 잘 보이는지 확인해봐요!!
Image



도메인 연결하기

도메인이 왜 필요할까요?

mirror.yourdomain.com 같은 도메인을 설정하면 사용자 접근이 매우 편리해지죠!


가령, 카카오는 미러 서버를 mirror.kakao.com로 제공해주고 있죠?


설정 방법

  • 1. 도메인 구매: Gabia, GoDaddy 등에서 도메인을 구입해요!
  • 2. DNS 설정: A 레코드를 추가해 서버 IP와 연결하면 됩니다!

그리고 HTTPS 적용도 하는걸 권장해요!

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d mirror.yourdomain.com

인증서 만료같은 부분은 자동화 스크립트를 작성해서 만료일자가 다가오면 자동으로 연장되도록 설정하는 방법도 있어요.


알아두면 좋은 팁

  • 저장 공간: 전체 저장소를 미러링하는 경우 용량이 매우 커질 수 있으니 모니터링이 필수에요!
  • 네트워크: 동기화와 다운로드 트래픽을 고려해서 미러 서버를 운영하세요!
  • 유지보수: 동기화 로그를 주기적으로 보는게 좋겠죠? (/var/log/rsync.log)


마무리

미러 서버를 운영하는 방법에 대해서 학습해봤습니다!

만약 공개 미러 로 운영을 하고자 한다면 각 배포판별 공식 미러로 등록해보시는 건 어떤가요?

    Tag -

Loading script...