Profile picture

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

JaehyoJJAng2024년 12월 18일

미러 서버, 왜 필요할까? 🤔

사내에 수십, 수백 대의 Ubuntu 서버가 있다고 가정해보겠습니다.

각 서버가 패키지를 설치하거나 업데이트할 때마다 공식 Ubuntu 아카이브 서버에 접속해서 파일을 다운로드하겠죠?


물론 공식 Ubuntu 아카이브 서버가 아닌 국내에 미러링하는 사이트에서 파일을 다운로드 받을 수도 있을겁니다.


하지만 이는 상당한 인터넷 대역폭을 소모하며, 특히 대규모 업데이트 시에는 네트워크에 엄청난 부하를 줄 수 있어요.


만약 이러한 미러 서버를 사내에 구축한다면 어떨까요?

외부 인터넷을 이용할 필요 없이 사내망에서 바로 다운로드가 가능하지 않을까요?


미러 서버 는 이러한 문제를 해결하기 위해 내부에 공식 저장소의 복제본 을 만들어두는 것입니다.


내부 서버들은 더 이상 멀리 있는 공식 서버가 아닌, 가까운 내부 네트워크의 미러 서버를 통해 패키지를 다운로드하므로 속도가 매우 빠르고 안정적이겠죠.


준비물 🛠️

미러 서버를 구축하기 위해서는 다음과 같은 준비물이 있어야 해요!


저장 공간

  • 미러 서버를 수행할 리눅스 서버: 미러링을 수행할 서버가 있어야겠죠?
  • 꽤 충분한 저장 공간: 아시는 분은 아시겠지만 배포판별 아카이브만해도 용량이 정말 꽤 됩니다. 최소 500GB 이상의 여유 공간은 확보되어야 합니다. 또 시간이 지남에 따라 더 늘어날 수도 있어요.
  • 웹 서버: 미러링된 파일을 다른 서버에 제공하기 위한 웹 서버입니다. 이 가이드에서는 Nginx를 기준으로 설명할게요.

하드웨어

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

네트워크

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

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

먼저 아래 작업은 모두 root 권한으로 수행할 것이기 때문에

아래 명령어를 실행해 root로 전환해주세요.

sudo -i

1. 필수 패키지 설치

미러 서버를 구축하는 데 필요한 패키지들을 먼저 다운로드 해주겠습니따!

apt install -y rsync wget curl nginx

2. 데이터 저장 폴더 생성

설치가 끝나셨나요?

그럼 이제 원본 서버로부터 복제한 데이터를 저장할 폴더를 생성해야 해요!

mkdir -p /mirror

3. 데이터 복제할 도구 준비하기 🛠️

필수 패키지 설치에서 rsync를 설치했었죳?

저는 rsync를 이용해서 데이터를 복제해볼겁니다.

데이터는 어디서 복제하냐구요?


바로 유일무이한 국내 미러링 사이트인 krfoss.org에서 제공하는 rsync 소스 URL을 참고해서 배포판별 데이터를 복제해올겁니다.
image 출처: 리눅스 미러 구축하기 (krfoss)


이제 데이터를 복제해오는 스크립트를 작성해보겠습니다.

참고로 해당 스크립트는 /mirror 폴더에 저장하지 말고 다른 곳에 저장해주세요.

데이터가 동기화되면서 스크립트가 삭제될 수 있답니다.


저는 다음과 같은 경로에 스크립트를 생성해주고 작성해보겠습니다.

mkdir -p ~/rsync-scripts; cd ~/rsync-scripts
vim rsync.sh
# rsync.sh

# Rokfoss rsync 서버 주소
REMOTE_HOST="rsync://mirror.funami.tech"

# 미러링할 원본 디렉토리
REMOTE_DIR="arch"

# 데이터 저장할 로컬 디렉토리
LOCAL_DIR="/mirror/arch"

# 로그 파일 경로
LOG_FILE="/tmp/mirror/$REMOTE_DIR/$REMOTE_DIR.log"

# 로그 시작 시간 기록
echo "=========================================" >> ${LOG_FILE}
echo "Rsync Start: $(date '+%Y-%m-%d %H:%M:%S')" >> ${LOG_FILE}

# rsync 명령어 실행
rsync -avH --delete \
      --timeout=600 \
      rsync://${REMOTE_HOST}/${REMOTE_DIR} ${LOCAL_DIR} >> ${LOG_FILE} 2>&1

# 로그 종료 시간 기록
echo "Rsync End: $(date '+%Y-%m-%d %H:%M:%S')" >> ${LOG_FILE}
echo "=========================================" >> ${LOG_FILE}

exit 0

스크립트에 실행 권한을 부여하고 파일 복제를 시작해보세요.

복제하려는 데이터의 용량이 크면 클수록 상당한 시간이 걸립니다.


4. 웹 서버 설정

미러링이 완료되었다면, 이제 다른 사용자들이 파일에 접근할 수 있도록 nginx를 설정해야겠죠?


1. nginx 설정 파일 생성

nginx의 설정 디렉토리로 이동해서 미러 서버를 위한 새로운 설정 파일을 생성해주세요.

sudo vi /etc/nginx/sites-available/arch-mirror

2. 설정 파일 내용 작성

생성한 파일에 아래 내용을 입력합니다.

이 설정은 /arch 경로로 들어오는 요청을 미러링된 파일이 있는 디렉토리로 연결하고, 파일 목록을 볼 수 있게해줘요!

server {
    listen 80;
    # listen [::]:80; # IPv6를 사용한다면 주석 해제

    # 서버 이름. 도메인이나 IP 주소를 입력합니다.
    server_name _;

    # 미러 데이터가 저장된 최상위 경로
    root /mirror;

    location / {
        # 디렉터리 리스팅을 활성화하여 패키지 매니저가 파일을 찾을 수 있게 함
        autoindex on;

        # 파일 크기를 사람이 읽기 쉽게 (KB, MB, GB) 표시
        autoindex_exact_size off;

        # 파일 시간을 서버의 로컬 시간으로 표시
        autoindex_localtime on;
    }

    # 접근 로그 비활성화 (선택 사항)
    # access_log off;
}
  • listen 80;: 80번 포트로 들어오는 HTTP 요청을 처리합니다.
  • location /: http://<서버IP>/ 형식의 요청을 처리하는 블록입니다.
  • autoindex on;: 웹 브라우저로 접속했을 때 디렉토리의 파일 목록을 보여주는 기능입니다.

3. 설정 활성화 및 재시작

작성한 설정을 Nginx가 읽을 수 있도록 sites-enabled 디렉토리에 심볼릭 링크를 생성하고,

기본 설정 파일과의 충돌을 막기 위해 default 링크는 삭제합니다.

# 기본 설정 링크 삭제
sudo rm /etc/nginx/sites-enabled/default

# 새로 만든 설정 파일 링크 생성
sudo ln -s /etc/nginx/sites-available/arch-mirror /etc/nginx/sites-enabled/

# Nginx 재시작하여 설정 적용
sudo systemctl restart nginx

이제 웹 브라우저나 다른 서버에서 http://<미러서버_IP>/ 로 접속했을 때 파일 목록이 보이면 성공입니다!


5. 테스트

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


[번외] rsync 서버 개방하기

rsync를 개방해서 다른 사람들이 제가 복제한 파일들을 다시 복제해갈 수 있도록 설정할 수 있습니다.

어떻게 설정하는지 차근차근 기록해볼게요!


rsync 데몬 설정하기

rsync 데몬을 설정해서 제가 복제해온 파일들을 다른 사람들이 읽기 전용으로 접근해 다운로드 해갈 수 있도록 설정해보겠습니다.

먼저 rsync 설정 파일을 열어 편집하겠습니다.

vim /etc/rsyncd.conf
# 전역 설정
uid = nobody
gid = nogroup
use chroot = yes
max connections = 25
timeout = 600
socket options = SO_KEEPALIVE

# 미러 디렉토리 설정
[debian]
path = /mirror/debian
comment = Debian Mirror
read only = true
host allow = 192.168.1.0/24
host deny = *

[ubuntu]
path = /mirror/ubuntu
comment = Ubuntu Mirror
read only = true
  • uid, gid: rsync 데몬이 실행될 사용자 및 그룹. 보안을 위해 권한이 낮은 사용자로 설정하는 것이 좋습니다.
  • use chroot: yes로 설정하면 지정된 경로(path)를 최상위 디렉터리로 인식하게 하여 보안을 강화할 수 있습니다.
  • read only: yes로 설정하면 미러 서버가 원본 서버의 파일을 변경하는 것을 막습니다.
  • hosts allow: 접속을 허용할 미러 서버의 IP를 지정합니다.
  • [web_source]: 모듈의 이름입니다. 미러 서버에서 이 이름을 사용하여 데이터에 접근합니다.
  • path: 실제 동기화할 원본 서버의 디렉터리 경로입니다.

이후에는 rsync 데몬을 실행해야 합니다.

서버가 재부팅 되어도 스스로 실행될 수 있도록 아래 명령어를 실행해주세요.

systemctl enable --now rsync

rsync 테스트하기

rsync 서버가 정상적으로 구축되었습니다.

이제 정상적으로 동작하는지 테스트해보겠습니다.

rsync rsync://서버주소/ --list-only

위 명령어 입력 시 다음과 같은 문제가 발생하면 설정한 부분에 문제가 있는 것이니 시스템 로그를 한 번 확인해보세요.

journalctl -u rsync

로그 확인 후 문제를 해결하셨으면 서비스를 재시작해주세요 systemctl restart rsync


혹은 서버에 방화벽을 활성화했다면 다음 명령어를 사용해 rsync 포트를 허용해주세요.

# UFW
ufw allow 873/tcp
ufw status

# Firewalld
firewall-cmd --permanent --add-service=rsyncd
firewall-cmd --reload

# IPtables
iptables -A INPUT -p tcp --dport 873 -j ACCEPT
iptables-save
    Tag -

Loading script...