Profile picture

[Linux] Ubuntu 22.04에서 오픈 소스 프로젝트 미러(Mirror) 서버 운영하기 (feat. Proxmox ISO)

JaehyoJJAng2024년 12월 18일

개요

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

게시글에서는 Proxmox ISO를 예시로 들며, 미러 서버의 동작 원리부터 설정 과정, 도메인 연결까지 단계별로 정리해보려고 합니다.


미러 서버란 무엇일까?

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

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


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

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

미러 서버를 운영하면 다음과 같은 이점을 챙길 수 있어요!


  • 원본 서버의 부하를 줄일 수 있어요.
  • 다운로드 속도를 빠르게 제공할 수 있어요.

미러 서버의 동작 원리

  • 데이터 동기화: 원본 서버에서 데이터를 주기적으로 가져와야 해요! (예: rsync 사용)
  • 콘텐츠 제공: 동기화된 데이터를 웹 서버(HTTP/HTTPS)나 FTP로 배포해요!
  • 리다이렉션: 사용자 요청을 가까운 미러로 연결해요 (선택 사항)

제 경우에는 Proxmox ISO를 미러링할 것이기 때문에

공식 다운로드 서버에서 ISO 파일을 가져와서 내 서버에 저장하고, 이를 웹으로 제공 하는 식이 되겠죠?


미리 서버 운영을 위한 준비

하드웨어: 충분한 디스크 공간과 안정적인 네트워크 연결


디스크 공간은 최대한 많이 확보가 되어야 해요!

제 경우에는 ISO만 미러링 하는 것이기 때문에 큰 용량이 필요하지는 않았어요.


또한, 미러를 운영하려는 서버 환경의 안정적인 네트워크 연결이 필요해요.

미러 서버 사용자가 늘어난다면 그만큼 안정적인 네트워크 환경이 중요하겠죠? 트래픽이 몰린다면 다운로드 속도 또한 느려질테니까요!


단계별 설정 과정

1. 서버 준비

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

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

sudo apt update && sudo apt upgrade -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...