본문 바로가기

Issues/backend

(배포 환경) nCloud 백엔드 시스템 구축 과정: Node, MySQL, Nginx

 

개요

최근 네이버 클라우드를 기반으로 백엔드 시스템을 구축하면서, Node.js, MySQL, Nginx 등을 설치하고 구성하는 과정을 정리했습니다. 이 글에서 다룰 내용은 백엔드 개발자라면 누구나 쉽게 따라할 수 있는 기본적인 설정들입니다. 이 프로젝트는 외주 요청을 받아 풀스택으로 직접 구축한 것으로, 배포 환경 최적화와 비용 효율성을 고려해 설계되었습니다.

 

다만, 여기서 다룬 설정은 기본적인 작업들이며, 백엔드 시스템을 구축하는 데 있어 필수적인 기초 작업들입니다. 이번 작업의 주요 목표는 서비스의 안정성과 시스템 효율성을 확보하는 것이었습니다. 이 글에서는 서버 초기 설정, 데이터베이스 설치, 리버스 프록시 설정 등 주요 단계를 기술적으로 다뤄보겠습니다.

 

nCloud 초기 설정

네이버 클라우드에서는 Object Storage를 활용해 파일 저장 및 백업 관리를 진행했습니다. 구축한 시스템은 프랜차이즈 본사의 홈페이지, CMS, 그리고 관리자 페이지 서버로 활용되고 있으며, VPC를 통해 보안과 네트워크를 강화했습니다. 또한, 서버에 Public IP와 Global DNS를 설정해 외부 접근성을 높였습니다. 이러한 사전 설정을 통해 인프라의 보안, 성능, 접근성을 강화하여 안정적인 운영을 보장하고 있습니다.

 

과거에는 AWS와 S3를 사용해 서버 시스템을 구축한 경험이 있었지만, 운영 비용이 예상보다 많이 발생하는 문제가 있었습니다. 이러한 경험을 바탕으로 이번에는 더 경제적인 네이버 클라우드를 선택하게 되었습니다. 클라우드 플랫폼의 선택지는 많지 않지만, 무조건 AWS와 같은 유명한 플랫폼을 사용하는 것보다, 프로젝트의 규모와 예상되는 영업 이익 등을 고려해 가장 적합한 솔루션을 선택하는 것이 중요하다고 생각합니다.

 

서버 초기 설정 및 업데이트

서버 환경을 설정하는 첫 단계는 시스템을 최신 상태로 유지하는 것입니다. 네이버 클라우드에서 제공하는 서버에 SSH로 접속한 후, 시스템을 다음과 같이 업데이트합니다. 필요에 따라 서버의 OS도 업그레이드할 수 있으며, 예를 들어 Ubuntu 18에서 20으로 업그레이드하는 작업이 가능합니다. 네이버 클라우드의 기본 Ubuntu 설치 버전이 18이기 때문에 시스템 안정성을 위해 20 버전으로 업그레이드하는 데 약 2시간 정도가 소요되었습니다.

ssh root@XXX.XXX.153.175 -p 22
sudo apt update && sudo apt upgrade

 

Node.js와 NVM 설치

Node.js 버전 관리를 위해 **NVM(Node Version Manager)**을 활용했습니다. 이는 대부분의 개발자가 기본적으로 사용하는 방식이며, 특별히 복잡한 작업은 아닙니다. 이를 통해 다양한 Node.js 버전을 간편하게 관리할 수 있었으며, 이는 사용하는 라이브러리의 요구 버전에 맞추기 위해 기본적으로 모두 사용하는 것입니다. 아래 스크립트를 통해 특정 버전의 Node.js를 설치하고, 프로젝트에 맞는 버전을 손쉽게 전환할 수 있습니다.

 

- NVM 설치

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

 

- NVM 환경 설정

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \ . "$NVM_DIR/nvm.sh"
nvm install 18.19.1

 

MySQL 설치 및 설정

데이터베이스로는 MySQL을 선택했습니다. 설치 후 root 사용자에 대한 보안을 강화하기 위해 복잡한 비밀번호를 설정했습니다. 이러한 설정을 통해 데이터베이스의 기본 보안을 강화할 수 있었습니다.

sudo apt install mysql-server
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'my_secure_password';

 

Git 및 SSH 설정

소스 코드 관리를 위해 Git을 설치하고, GitHub와 같은 원격 저장소에서 코드를 가져오는 설정을 진행했습니다. SSH 키를 사용해 인증을 설정함으로써, 코드 배포의 안전성과 효율성을 높였습니다. 생성된 공개 키를 GitHub에 등록하여 안전한 인증 과정을 설정했습니다.

sudo apt install git-all
ssh-keygen
cat ~/.ssh/id_rsa.pub

 

Nginx 설치 및 Reverse Proxy 설정

Nginx는 고성능 리버스 프록시 서버로, Node.js 애플리케이션을 외부에서 접근 가능하게 설정합니다. 이를 통해 로드 밸런싱을 구현하고 시스템의 안정성을 높였습니다. Nginx를 설치하기 전, 서버에 접속하면 기본적으로 아파치의 첫 페이지가 표시되었습니다. 이는 네이버 클라우드 기본 설정에서 아파치가 설치되어 있기 때문입니다. 이 페이지는 이후 Nginx 설치와 설정을 통해 대체되었습니다.

sudo apt install nginx

 

설치 후 다음과 같은 Nginx 설정 파일을 작성해 리버스 프록시를 구성했습니다.

server {
    listen 80;
    server_name api.XXXXXXXXXXXXX.co.kr;

    location / {
        proxy_pass http://localhost:4000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

 

설정을 완료한 후 Nginx 설정 파일의 유효성을 검사하고, 서비스 재시작을 통해 변경 사항을 반영합니다:

sudo nginx -t
sudo systemctl restart nginx

 

이 설정은 백엔드 서버의 보안을 강화하고, 외부 트래픽을 효율적으로 관리할 수 있도록 합니다.

 

DNS 및 방화벽 설정

도메인 등록 기관을 통해 DNS 설정을 마친 후, 방화벽을 설정하여 HTTP 트래픽을 허용합니다:

sudo ufw allow 'Nginx Full'
sudo ufw reload

 

이러한 설정을 통해 외부에서 서브도메인을 통해 안전하게 백엔드 서버에 접근할 수 있도록 구성하였습니다.

 

PM2를 통한 Node.js 애플리케이션 관리

PM2는 Node.js 애플리케이션을 효율적으로 관리하기 위한 도구로, 서버가 재시작될 때 자동으로 애플리케이션을 시작하도록 설정할 수 있습니다. 이는 운영 환경에서의 안정성을 크게 높여줍니다:

npm install -g pm2
pm2 start app.js

 

PM2는 서버 운영 시 발생할 수 있는 문제를 실시간으로 모니터링하고, 애플리케이션의 지속적인 실행을 보장합니다.

 

마무리 및 향후 계획

이번 구축 과정에서는 네이버 클라우드를 기반으로 MySQL, Node.js, Nginx 등을 활용해 백엔드 시스템을 설계하고 안정적인 운영 환경을 구축하였습니다. 이러한 설정 과정은 단순한 서버 구성 이상의 의미를 지니며, 비용 효율성과 배포 환경 최적화를 고려한 체계적인 접근 방식을 보여줍니다. 실제로 구축 과정에서 각 요소들이 원활하게 작동할 수 있도록 최적화하고 문제를 미리 예측하여 해결 방안을 마련하는 등, 인프라 운영에 있어서 중요한 역할을 담당했습니다.

 

향후에는 Docker와 Kubernetes, Jenkins 등을 활용하여 CI/CD 파이프라인을 구축하고 배포 자동화에 대한 경험도 정리하여 글로 다룰 예정입니다. 이를 통해 팀 전체의 개발 속도를 높이고, 배포 과정의 신뢰성을 향상시키고자 합니다. 이러한 구축 과정은 단순한 기능 개발을 넘어, 전체적인 운영 효율성을 극대화하는 데 큰 기여를 할 것입니다.