DEVOPS

AWS EC2 + Nginx + PM2 완전 가이드 -- Node.js 서버 배포부터 HTTPS까지

junetapa 2026. 2. 19 14 min read

EC2 인스턴스 생성부터 서버 초기화, PM2 프로세스 관리, Nginx 리버스 프록시, Let's Encrypt 무료 HTTPS까지 -- 실전 운영 가능한 서버를 처음부터 끝까지 구축하는 과정을 정리했다. 처음 서버를 구축하는 개발자도 따라할 수 있는 완전 가이드다.

AWS EC2란? 프리 티어로 서버 무료 운영

Amazon EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스다. 내 컴퓨터처럼 운영체제를 선택하고, CPU, 메모리, 스토리지를 자유롭게 구성하여 웹 서버, API 서버, 데이터베이스 서버 등을 운영할 수 있다. 프리 티어 t2.micro 인스턴스는 12개월간 매월 750시간 무료로 제공되어, 개인 프로젝트나 소규모 서비스를 비용 없이 시작할 수 있다.

EC2 인스턴스 타입 비교

인스턴스vCPU메모리시간당 요금적합 용도
t2.micro11 GB무료 (12개월)개인 프로젝트, 테스트
t3.small22 GB약 $0.023/hr소규모 웹 서비스
t3.medium24 GB약 $0.046/hr중규모 앱, API 서버
t3.large28 GB약 $0.083/hr트래픽 높은 서비스
프리 티어 조건

t2.micro 750시간/월 = 1개 인스턴스를 한 달 내내 가동 가능. 2개 인스턴스를 동시에 켜면 375시간씩 나뉜다. 프리 티어 기간은 AWS 계정 생성일 기준 12개월이며, 이후부터는 요금이 청구된다.

EC2는 초기 설정이 복잡하지만, 운영 중인 서버에 직접 SSH 접속하여 모든 것을 제어할 수 있다는 점이 가장 큰 장점이다. Nginx, PM2, 데이터베이스, 방화벽 등 서버 스택을 마음대로 구성할 수 있어 실무 개발자에게 필수 경험이다.

EC2 인스턴스 생성 -- Ubuntu 24.04 LTS

01

AWS 콘솔 접속 후 EC2 인스턴스 시작

AWS 콘솔 로그인 후, 서비스 검색에서 "EC2"를 찾아 대시보드로 이동. 리전을 ap-northeast-2(서울)로 설정하면 한국 사용자에게 가장 빠르다.

02

AMI 선택 -- Ubuntu Server 24.04 LTS

"Ubuntu Server 24.04 LTS (HVM), SSD Volume Type"을 선택한다. 프리 티어 사용 가능 배지가 있는 이미지인지 확인하자.

03

인스턴스 타입 선택 -- t2.micro

1 vCPU, 1 GiB 메모리로 소규모 Node.js 앱 운영에 충분하다.

04

키 페어 생성 -- SSH 접속용 .pem 파일

키 페어 이름을 입력하고, RSA + .pem 형식을 선택한다. .pem 파일은 분실하면 재발급이 불가능하므로 안전한 곳에 저장해야 한다.

05

스토리지 설정

프리 티어 기준 gp2 SSD 30 GB까지 무료다. 기본값(8 GB)을 20~30 GB로 늘려도 프리 티어 범위 내에 있다.

06

인스턴스 시작 및 퍼블릭 IP 확인

"인스턴스 시작" 클릭 후 약 1~2분 기다리면 인스턴스 상태가 "실행 중"으로 바뀐다. 하단 패널에서 퍼블릭 IPv4 주소를 확인할 수 있다.

보안 그룹 설정 -- SSH, HTTP, HTTPS 포트

보안 그룹(Security Group)은 EC2 인스턴스의 방화벽 역할을 한다. 화이트리스트 방식으로 동작하며, 명시적으로 허용하지 않으면 모두 차단된다.

유형포트소스설명
SSH22내 IP서버 SSH 접속 (내 IP만 허용 권장)
HTTP800.0.0.0/0일반 웹 트래픽
HTTPS4430.0.0.0/0보안 웹 트래픽
사용자 지정3000개발 시만Node.js 앱 직접 테스트 (운영 시 닫음)
보안 주의

SSH 포트 22를 0.0.0.0/0(전체 허용)으로 설정하면 전 세계에서 무차별 대입 공격이 들어온다. 반드시 내 IP 주소만 허용하거나, 포트를 22에서 다른 번호(예: 2222)로 변경해야 한다.

서버 초기 설정 -- 패키지 업데이트, Node.js 설치

SSH로 서버에 접속한 후 가장 먼저 해야 할 작업이다. 패키지 업데이트로 최신 보안 패치를 적용하고, NodeSource 공식 저장소를 통해 Node.js LTS 버전을 설치한다.

bash -- 서버 초기 설정 # 패키지 업데이트 sudo apt update && sudo apt upgrade -y # Node.js 22 LTS 설치 curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install -y nodejs # 앱 클론 및 의존성 설치 mkdir -p ~/apps && cd ~/apps git clone https://github.com/yourname/your-app.git cd your-app npm ci --omit=dev
스왑 파일 추가

t2.micro(1GB RAM)는 npm install 중 메모리 부족이 발생할 수 있다. sudo fallocate -l 2G /swapfile로 2GB 스왑 파일을 만들어 해결할 수 있다.

PM2로 Node.js 앱 프로세스 관리

Node.js 앱을 node src/index.js로 직접 실행하면 터미널을 닫는 순간 프로세스가 종료된다. PM2는 Node.js 프로세스를 백그라운드에서 관리하고, 크래시 시 자동 재시작, 서버 부팅 시 자동 시작, 클러스터 모드, 로그 관리 기능을 제공하는 프로덕션 필수 도구다.

bash -- PM2 설치 및 실행 sudo npm install -g pm2 # ecosystem.config.js로 실행 pm2 start ecosystem.config.js # 서버 재시작 시 PM2 자동 시작 설정 (필수) pm2 startup pm2 save # 주요 명령어 pm2 list # 프로세스 목록 pm2 logs my-app # 실시간 로그 pm2 reload my-app # 무중단 재시작 pm2 monit # 실시간 모니터링

Nginx 설치 및 리버스 프록시 설정

실무에서는 Nginx를 리버스 프록시로 앞에 두는 방식을 표준으로 사용한다. Nginx는 정적 파일 서빙, Gzip 압축, SSL 종료, 로드밸런싱, 보안 헤더 추가 등을 Node.js보다 훨씬 효율적으로 처리한다.

nginx -- 리버스 프록시 설정 server { listen 80; server_name yourdomain.com www.yourdomain.com; # 보안 헤더 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; # Gzip 압축 gzip on; gzip_types text/plain text/css application/json application/javascript; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

Let's Encrypt SSL 인증서 발급 (무료 HTTPS)

Let's Encrypt는 비영리 인증 기관에서 제공하는 무료 SSL/TLS 인증서다. Certbot 도구를 사용하면 인증서 발급부터 Nginx 설정 수정, 자동 갱신 크론잡 등록까지 한 번에 처리된다.

bash -- Certbot SSL 발급 sudo apt install -y certbot python3-certbot-nginx # SSL 인증서 발급 (Nginx 설정 자동 수정) sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com # 자동 갱신 테스트 sudo certbot renew --dry-run
사전 조건

Let's Encrypt 인증서를 발급하려면 도메인이 EC2 서버의 퍼블릭 IP를 가리키고 있어야 한다. DNS가 전파되기 전에 Certbot을 실행하면 도메인 소유권 확인에 실패한다.

도메인 연결 -- Route 53 또는 외부 DNS

도메인을 EC2 서버에 연결하려면 DNS의 A 레코드가 EC2의 퍼블릭 IP를 가리키도록 설정해야 한다. EC2의 퍼블릭 IP는 인스턴스를 재시작하면 변경되므로, Elastic IP(고정 IP)를 할당하는 것이 표준이다.

자동 배포 스크립트 -- Git pull + PM2 reload

코드를 수정할 때마다 서버에 SSH로 접속해서 git pull하고 pm2 reload하는 과정을 자동화할 수 있다.

bash -- deploy.sh #!/bin/bash set -e APP_DIR="/home/ubuntu/apps/my-app" cd $APP_DIR echo "[1/4] git pull origin main" git pull origin main echo "[2/4] npm ci --omit=dev" npm ci --omit=dev echo "[3/4] pm2 reload ecosystem.config.js --update-env" pm2 reload ecosystem.config.js --update-env echo "[4/4] 배포 완료: $(date)" pm2 list

운영 체크리스트 -- 모니터링, 로그, 백업

서버를 구축했다고 끝이 아니다. 안정적인 운영을 위한 모니터링과 관리 체계를 갖추는 것이 더 중요하다.

01

CloudWatch 기본 모니터링 활성화

CPU 80% 이상 지속 시 CloudWatch 알람을 설정하여 이메일/SMS 알림을 받자.

02

PM2 로그 로테이션 설정

pm2-logrotate 모듈을 설치하면 로그 파일이 무제한으로 커지는 것을 방지한다.

03

UFW 방화벽 설정

AWS 보안 그룹과 별개로 OS 수준의 방화벽을 추가로 설정한다.

04

정기 패키지 업데이트 자동화

unattended-upgrades를 설정하면 보안 패치가 자동으로 적용된다.

05

외부 모니터링 도구 연동

UptimeRobot, Better Uptime 같은 무료 서비스로 서버 다운 알림을 받자.

AWS EC2NginxPM2Node.jsHTTPS서버 배포DevOps
junetapa
junetapa
DevOps와 자동화에 관심이 많은 개발자. 실전 경험을 바탕으로 기술을 공유한다.
Twitter Facebook URL 복사