반응형

 

지난 두 글에서는 코드를 자동으로 검사, 전달하는 방법(CI/CD)과, 서비스를 안 끊고 새 버전으로 바꾸는 방법(블루,그린 배포)을 정리했습니다.

그런데 이 모든게 돌아가려면 결국 무대가 하나 필요합니다.

바로 우리 서비스가 24시간 켜져 있을 서버입니다.

 

이번 글에서는 그 서버를 처음부터 세팅하는 과정을 정리하겠습니다.

집에 굴러다니는 컴퓨터를 홈 서버로 쓰든, 클라우드에서 서버를 하나 빌리든, 결국 그 안은 대부분 리눅스라는 운영체제입니다.

그래서 어디서 하든 해야 하는 일은 거의 똑같습니다. 이글은 우분투를 기준으로 합니다.

 


우리가 만들 구조 먼저 보기 

 

세부 단계에 들어가기 전에, 서버 안이 어떤 모양이 될지 그림으로 보겠습니다.

사용자가 우리 사이트에 접속하면, 그 요청은 먼저 서버의 정해진 문(포트)으로 들어옵니다.

그 문 바로 안쪽에 Nginx 라는 교통정리 담당이 서 있다가, 이건 화면 요청이네 -> 프론트엔드로 ,또 다른건 데이터 요청이네 -> 백엔드로 하고 알맞은 곳으로 보내줍니다.

그리고 프론트엔드와 백엔드는 각각 도커라는 도구 위에서 상자형태로 돌아갑니다.

 

이번 글의 목표는 이 그림을 실제로 만드는 겁니다. 

 


서버 준비하기

 

홈 서버라면 우분투를 설치한 컴퓨터가 한 대 있으면 되고, 클라우드라면 AWS, 오라클 클라우드, 가비아, 카페24 같은 곳에서 우분투 서버를 하나 만들면 됩니다. 어느 쪽이든 준비가 되면, 그 서버에 원격으로 접속하는 것부터 시작합니다.

 

원격 접속은 SSH로 합니다. 내 컴퓨터 터미널에서 이렇게 칩니다.

ssh OOO(접속계정)@OOO(서버주소)

 

접속이 됐으면, 가장 먼저 설치된 프로그램 목록을 최신으로 갱신하고 업그레이드합니다.

새 서버에서 거의 항상 가장 먼저 하는 일입니다.

sudo apt update && sudo apt upgrade -y

 

sudo는 관리자 권한으로 실행한다는 뜻이고, apt는 우분투에서 프로그램을 설치, 관리하는 도구입니다.

뒤에 붙은 -y는 물어보지 말고 예라고 대답해줘라는 의미입니다.

 


도커 설치하기

 

이제 우리 서비스를 상자 단위로 실행해줄 도커를 설치합니다.

여기서 한 가지 주의할 점이 있습니다.

우분투에도 기본으로 docker.io라는 도커 꾸러미가 있긴 한데, 이건 버전이 한참 옛날 것인 경우가 많습니다.

그래서 도커가 직접 운영하는 공식 저장소를 등록해서 최신 버전을 설치하는 게 정석입니다.

아래 순서대로 하면 됩니다.

 

[1 - 공식 저장소 등록 준비]

# 필요한 도구 설치
sudo apt update
sudo apt install -y ca-certificates curl

# 도커의 공식 열쇠(GPG 키)를 받을 폴더 만들고 키 내려받기
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

 

여기서 받는 GPG 키는 이 프로그램이 진짜 도커가 만든 게 맞다는걸 확인하는 일종의 인감도장이라고 보시면 됩니다. 

 

[2 - 도커 저장소를 등록하기]

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# 등록했으니 목록을 다시 갱신
sudo apt update

 

중간의 $(...) 부분은 내 서버의 우분투 버전과 칩 종류를 자동으로 알아내서 채워주는 부분이라, 그대로 복사해 붙여넣으면 됩니다.

 

[3 - 도커 설치]

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

도커 본체와 명령어 도구, 그리고 여러 상자를 한 번에 묶어 실행해주는 도커 컴포즈까지 같이 설치됩니다.

 

예전에는 도커 컴포즈를 docker-compose(가운데 붙임표)라는 별도 명령으로 사용했는데, 지금은 도커에 내장된 기능이라 docker compose(띄어쓰기)로 사용합니다.
옛날 블로그 글을 보고 따라 하다 보면 이 차이 때문에 헷갈릴 수 있으니 알아두시면 좋습니다.

 

[4 - 설치 확인과 마무리 설정]

sudo docker run hello-world

 

축하 메시지가 나오면 성공입니다.

그리고 마지막으로 두 가지를 더 해두면 편합니다.

 

# 서버가 재부팅돼도 도커가 자동으로 켜지게 설정
sudo systemctl enable --now docker

# 매번 sudo를 안 붙여도 되게, 내 계정을 docker 그룹에 추가
sudo usermod -aG docker $USER

 

두 번째 명령(usermod)을 하면 앞으로 docker 명령 앞에 sudo를 붙이지 않아도 됩니다.

단, 이 설정은 한 번 로그아웃했다가 다시 접속해야 적용 됩니다.

안되면 접속을 끊고 다시 들어와보시면 됩니다.

 


Nginx로 교통정리 하기

 

이제 교통정리 담당인 Nginx 차례입니다.

Nginx는 들어온 요청을 알맞은 곳으로 넘겨주는 역할(리버스 프록시)을 합니다.

설치 방법은 두 가지인데, 서버에 직접 설치하는 방법과 도커 컨테이너로 띄우는 방법이 있습니다.

여기서는 이해하기 쉽게 서버에 직접 설치하는 방법으로 설명하겠습니다.

sudo apt install -y nginx

 

설치가 끝나면 Nginx는 자동으로 켜집니다. 

브라우저에서 서버 주소로 접속해봤을 때 Welcome to nginx! 라는 기본 화면이 보이면 잘 설치된 겁니다.

 

[설정 파일 작성하기]

 

Nginx에게 이런 요청은 이쪽으로 보내라고 알려주는 설정을 적어야 합니다.

설정 파일은 보통 이 위치에 만듭니다.

sudo nano /etc/nginx/sites-available/OOO(내사이트이름)

 

nano는 터미널에서 쓰는 간단한 글쓰기 도구입니다.

파일이 열리면 아래 내용을 적습니다.

바꿔야 할 부분은 OOO으로 표시했습니다.

 

server {
    listen 80;
    server_name OOO(내 도메인 또는 서버 IP);

    # 화면(프론트엔드) 요청은 이쪽으로
    location / {
        proxy_pass http://OOO(프론트 주소):OOO(포트);
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 데이터(백엔드) 요청은 이쪽으로
    location /api/ {
        proxy_pass http://OOO(백엔드 주소):OOO(포트);
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

내용을 풀어보면 이렇습니다.

  • listen 80 : 80번 문(포트)으로 들어오는 요청을 받겠다는 뜻입니다. 80은 웹 접속의 기본 문입니다.
  • location / {...} : 그냥 사이트 주소로 들어온 모든 요청은 프론트엔드로 넘기라는 뜻입니다.
  • location /api/{...} : 주소가 /api/로 시작하면 백엔드로 넘기라는 뜻입니다.
  • proxy_pass : 실제로 넘길 목적지 주소입니다.
  • proxy_set_header ... : 넘길 때 원래 누가 요청했는지 같은 정보를 전달해주는 부분입니다. 이게 없으면 백엔드가 접속자 정보를 제대로 못받는 경우가 있으니 같이 적어두는 게 좋습니다. 

다 적었으면 저장하고(Ctrl + o 누르고 엔터, 그 다음 Ctrl + x로 종료), 이 설정을 활성화 합니다.

# 작성한 설정을 활성화 폴더에 연결
sudo ln -s /etc/nginx/sites-available/OOO(내사이트이름) /etc/nginx/sites-enabled/

# 설정에 문법 오류가 없는지 검사
sudo nginx -t

# 문제없으면 설정을 다시 읽어 적용
sudo systemctl reload nginx

 

여기서 sudo nginx -t 가 중요합니다. 설정 파일에 오타가 있으면 이 검사에서 걸러줍니다.

검사를 통과한 뒤에 적용하는 습관을 들이면, 잘못된 설정 때문에 사이트 전체가 멈추는 사고를 막을 수 있습니다.

 


방화벽 - 필요한 문만 열어두기

 

서버는 보안을 위해 대부분의 문(포트)을 닫아둡니다.

우리가 사용할 문만 열어줘야 하는데, 우분투에서는 ufw 라는 간단한 방화벽 도구를 사용합니다.

sudo ufw allow OpenSSH      # 원격 접속용 문 (이걸 안 열면 접속이 끊깁니다!)
sudo ufw allow 'Nginx Full' # 웹 접속용 문 (80, 443)
sudo ufw enable             # 방화벽 켜기

 

방화벽을 켜기 전에 반드시 SSH문을 먼저 열어야 합니다.
이걸 빼먹고 방화벽을 켜면, 지금 접속해 있는 나 자신도 다음부터 서버에 들어가지 못하게 됩니다.
클라우드 서버에서 이걸 실수하면 골치아파지니 순서를 지켜주세요.

 


1편의 자동 배포와 연결하기

 

여기까지 하면 서버 준비가 끝납니다. 이제 1편에서 만든 자동 배포가 이 서버에 접속할 수 있게 열쇠를 만들어 연결하면 조각이 이어집니다.

 

자동 배포가 사람처럼 비밀번호를 칠 수는 없으니, 비밀번호 대신 쓰는 열쇠 한 쌍을 만들어줍니다.

내 컴퓨터 서버에서 이렇게 만듭니다.

ssh-keygen -t ed25519 -C "deploy key"

 

그러면 열쇠가 한 쌍 생깁니다. 하나는 공개키(자물쇠 역할, 보통 .pub이 붙음), 하나는 비밀키(열쇠 역할)입니다.

 

  • 공개키(자물쇠)는 서버의 ~/.ssh/authorized_keys 파일에 등록합니다. 이 열쇠를 가진 사람은 들여보내라는 뜻입니다.
  • 비밀키(열쇠)는 1편에서 등록했던 깃허브 저장소의 비밀값(Secrets)에 넣습니다.

 

이렇게 하면 자동 배포가 이 열쇠로 서버 문을 열고 들어와, 2편에서 만든 블루 - 그린 배포 스크립트를 실행하게 됩니다.

1편(자동 검사-전달) -> 3편 (서버) -> 2편(무중단 교체)이 하나로 이어집니다.

 


정리

 

이번 글에서는 텅 빈 서버를 실제로 서비스가 돌아가는 무대로 만드는 과정을 정리했습니다.

핵심만 다시 짚으면 이렇습니다.

 

  • 홈서버든 클라우드든 안은 리눅스(우분투)라 하는 일은 거의 같습니다.
  • 도커는 우분투 기본 꾸러미 말고 공식 저장소로 최신 버전을 설치해야합니다.
  • Nginx를 교통정리(리버스 프록시)로 두고, location으로 요청을 프론트 -백엔드에 나눠보냅니다.
  • 설정을 적용하기 전에 항상 nginx -t로 문법을 검사합니다.
  • 방화벽은 SSH문을 먼저 열고 켭니다(안그러면 나도 못들어갑니다)
  • 자동 배포용 SSH열쇠를 만들어 서버와 깃허브를 연결하면 세 편이 하나로 이어집니다.

이걸로 자동 배포 > 서버 준비 > 무중단 교체로 이어지는 한 바퀴가 완성되었습니다.

다음 글에서는 여기에 도메인을 연결하고, 접속을 자물쇠로 잠그는 HTTPS인증서를 다는 방법을 정리해보겠습니다.

728x90
반응형