2025-09-30 15:07 리액트 넥스트
📘 Next.js AWS EC2 최종 배포 핸드북 (t3.micro 기준)
이 가이드는 t3.micro 인스턴스를 사용하여 Next.js 애플리케이션을 AWS EC2에 배포하고, PM2와 Nginx로 안정적인 프로덕션 서비스를 구축하는 A to Z 과정을 안내합니다.
Part 1: AWS EC2 인프라 준비
서버를 생성하고, 보안 설정을 하며, 향후 발생할 문제를 미리 방지하기 위해 디스크 용량을 넉넉하게 설정합니다.
-
EC2 인스턴스 생성
-
AMI:
UbuntuServer (최신 LTS 버전 추천) -
인스턴스 유형:
t3.micro- (참고):
t3.micro는t2.micro보다 CPU 성능이 더 좋고 안정적이며, 비용은 비슷하거나 저렴합니다. AWS 프리티어에 포함되어 있어 월 750시간 무료 사용이 가능합니다.
- (참고):
-
키 페어:
.pem키를 생성하고 절대 잃어버리지 않도록 안전한 곳에 보관하세요.
-
-
스토리지(디스크) 설정
- 기본값인 8GB는 장기적으로 부족합니다. 처음부터 20GB로 설정하는 것을 강력히 추천합니다. (AWS 프리티어는 30GB까지 무료)
-
네트워크 (보안 그룹) 설정
**[인바운드 규칙 편집]**에서 꼭 필요한 포트만 허용하여 서버 보안을 강화합니다.
| 유형 | 프로토콜 | 포트 범위 | 소스 | 설명 |
|---|---|---|---|---|
| SSH | TCP | 22 | 내 IP | 서버 원격 접속용 |
| HTTP | TCP | 80 | 위치 무관 | 일반 웹 접속용 |
| HTTPS | TCP | 443 | 위치 무관 | 보안 웹 접속용 |
| 사용자 지정 TCP | TCP | 3000 | 위치 무관 | Next.js 테스트용 |
Part 2: EC2 서버 접속 및 기본 환경 설정
서버에 접속하여 프로젝트를 실행할 수 있는 기본 환경을 구축합니다.
-
SSH로 서버 접속
.pem 키가 있는 폴더에서 터미널을 열고 아래 명령어를 실행하세요.
Bash
# .pem 파일 권한 변경 (최초 1회) chmod 400 your-key-name.pem # 서버 접속 ssh -i "your-key-name.pem" ubuntu@<EC2_퍼블릭_IP> -
서버 업데이트 및 Node.js 설치
Bash
# 패키지 목록 최신화 sudo apt update && sudo apt upgrade -y # NVM(Node Version Manager) 설치 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.bashrc # Node.js LTS 버전 설치 nvm install --lts
Part 3: Private GitHub 저장소 연동
EC2 서버가 GitHub Private 저장소에 안전하게 접근할 수 있도록 SSH 키를 설정합니다.
-
EC2에서 SSH 키 생성 (모든 질문에 Enter)
Bash
ssh-keygen -t ed25519 -C "your_github_email@example.com" -
GitHub에 EC2 공개키 등록
-
아래 명령어로 공개키를 복사합니다.
Bash
cat ~/.ssh/id_ed25519.pub -
GitHub Settings → SSH and GPG keys → New SSH key에 복사한 키를 붙여넣습니다.
-
-
프로젝트 클론 (반드시 SSH 주소 사용)
Bash
git clone git@github.com:your-username/your-repo.git- 처음 연결 시
(yes/no)질문이 나오면yes를 입력하세요.
- 처음 연결 시
Part 4: 메모리 부족 문제 해결 (스왑 영구 설정)
t3.micro도 RAM은 1GB로 npm run build 시 메모리가 부족할 수 있습니다. 디스크의 일부를 가상 메모리로 사용하고, 이 설정이 서버 재부팅 후에도 유지되도록 설정합니다.
Bash
# 1. 2GB 크기의 스왑 파일 생성
sudo fallocate -l 2G /swapfile
# 2. 파일 권한 설정 (보안)
sudo chmod 600 /swapfile
# 3. 스왑 공간으로 포맷
sudo mkswap /swapfile
# 4. 스왑 활성화
sudo swapon /swapfile
# 5. 재부팅 후에도 스왑이 항상 유지되도록 fstab 파일에 설정 추가
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
# 6. 설정 확인 (Swap 항목에 2.0G가 보이는지 확인)
free -h
Part 5: Next.js 프로젝트 배포
이제 메모리 걱정 없이 프로젝트를 빌드하고 실행할 준비를 합니다.
Bash
# 프로젝트 폴더로 이동
cd your-repo
# 의존성 패키지 설치
npm install
# 프로덕션 빌드 실행
npm run build
Part 6: PM2를 이용한 무중단 서비스 운영 🚀
PM2를 사용하여 앱을 안정적으로, 그리고 서버 성능을 최대로 활용하여 운영합니다.
-
PM2 설치
Bash
npm install pm2 -g -
ecosystem.config.js 설정 파일 생성
프로젝트 루트에 아래 내용으로 ecosystem.config.js 파일을 생성합니다.
JavaScript
module.exports = { apps: [ { name: 'WSHP-front', // 관리할 앱 이름 script: 'npm', // 실행할 명령어 args: 'start', // 명령어의 인자 exec_mode: 'cluster', // 클러스터 모드로 CPU 모두 사용 instances: 'max', // CPU 코어 수만큼 앱 실행 autorestart: true, // 앱 종료 시 자동 재시작 watch: false, // 프로덕션 환경에서는 false env: { NODE_ENV: 'production', }, }, ], }; -
PM2 실행 및 자동 시작 설정
Bash
# 설정 파일로 앱 시작 pm2 start ecosystem.config.js # 서버 재부팅 시 PM2 자동 시작 설정 pm2 startup # 위 명령 실행 후 나오는 결과 명령어를 복사/붙여넣기하여 실행 pm2 save
Part 7: Nginx 리버스 프록시 설정 (선택사항이지만 강력 추천)
사용자가 http://your-ip와 같이 포트 번호 없이 접속할 수 있도록 Nginx를 설정합니다.
-
Nginx 설치 및 설정
Bash
# Nginx 설치 sudo apt install nginx -y # 설정 파일 생성 및 편집 sudo nano /etc/nginx/sites-available/your-project -
설정 파일 내용 붙여넣기
server_name을 본인의 IP 주소 또는 도메인으로 변경하세요.
Nginx
server { listen 80; server_name <EC2_퍼블릭_IP_주소>; 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_cache_bypass $http_upgrade; } } -
설정 활성화 및 재시작
Bash
# 설정 파일 활성화 링크 생성 sudo ln -s /etc/nginx/sites-available/your-project /etc/nginx/sites-enabled/ # 기존 기본 설정 삭제 sudo rm /etc/nginx/sites-enabled/default # Nginx 재시작 sudo systemctl restart nginx
이제 모든 설정이 완료되었습니다. 이 핸드북만 따라 하면 누구나 안정적인 Next.js 서비스를 EC2에 배포할 수 있습니다! 축하합니다! 🎉