AWS EC2로 실전 배포하기 - 퍼블릭과 프라이빗 망 구성부터 Nginx까지

“이제 진짜 만든 걸 세상에 보여줄 시간입니다.”
우리가 만들어 온 미니 프로젝트와 기능들, 이제는 실제 서버에 올려 ‘진짜 서비스’로 만드는 과정을 시작합니다.
🚀 왜 배포가 필요할까?
개발이란 결국 무언가를 만든다는 것이고, 배포란 그것을 누군가가 쓸 수 있게 만든다는 의미입니다.
아무리 멋진 기능을 만들어도, 로컬에서만 동작한다면 그것은 나만을 위한 프로그램일 뿐입니다.
배포는 곧 현실화입니다.
우리는 이번 편에서 AWS EC2를 통해 자신이 만든 서비스를 전 세계 누구나 접근할 수 있는 ‘인터넷상의 진짜 제품’으로 바꿔보게 됩니다.
☁️ EC2란?
**EC2(Amazon Elastic Compute Cloud)**는 AWS에서 제공하는 가상 서버입니다.
쉽게 말해, 인터넷에서 언제든 접근 가능한 내 컴퓨터 한 대를 임대한 셈입니다.
기본 개념 정리:
- 퍼블릭 VPC: 외부에서 접근 가능한 망 (ex. 웹서버, Nginx)
- 프라이빗 VPC: 외부와 차단된 내부 망 (ex. Node.js 서버)
- 보안 그룹: 방화벽 역할을 하며 포트 허용/제어
🛠️ 인프라 구성 시나리오
구성 요소 설명 위치
Nginx 서버 | 프록시/로딩 담당 | 퍼블릭 VPC |
Node.js 앱 | 실제 비즈니스 로직 실행 | 프라이빗 VPC |
PM2 | Node 앱 프로세스 관리 툴 | 프라이빗 VPC |
EC2 | 각 서버가 설치될 가상 컴퓨터 | AWS 내부 |
🧪 실습: EC2로 직접 배포해 보기
1. EC2 인스턴스 생성 (퍼블릭/프라이빗 나눔)
- Amazon Linux 2 / Ubuntu 선택
- 보안 그룹 설정: 22(SSH), 80/443(HTTP), 3000(Node) 허용 여부 조정
2. Node.js 앱 준비 (프라이빗 망 EC2)
- git clone으로 프로젝트 내려받기
- Node.js 설치: nvm, npm install
- PM2 설치: npm install pm2 -g
- 앱 실행: pm2 start app.js
3. Nginx 설치 및 리버스 프락시 설정 (퍼블릭 망 EC2)
1) Nginx 설치:
sudo apt update
sudo apt install nginx -y
설치 후 다음 명령어로 상태 확인:
sudo systemctl status nginx
2) 기본 포트 열기 (보안 그룹에서):
- 인바운드 규칙: 80 (HTTP), 443 (HTTPS) 허용
3) 리버스 프락시 설정:
Nginx는 Node.js 서버 앞에서 요청을 받아 프락시처럼 전달해 주는 역할을 합니다.
설정 파일 편집:
sudo nano /etc/nginx/sites-available/default
기본 server 블록 수정 예시:
server {
listen 80;
server_name 퍼블릭IP 또는 도메인명;
location / {
proxy_pass http://프라이빗EC2-IP: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;
}
}
설정 반영:
sudo nginx -t # 설정 오류 체크
sudo systemctl reload nginx
4) 결과 확인:
브라우저에서 퍼블릭 EC2의 공인 IP를 입력하고, Node.js 앱이 잘 뜨는지 확인합니다.
🧩 중간 개념: PM2란?
PM2는 Node.js 서버를 끊기지 않고 계속 실행되게 해주는 프로세스 관리자입니다.
- 서버가 죽으면 자동 재시작
- 로그 기록 가능
- 여러 개 앱 동시 실행 가능
예시:
npm install pm2 -g
pm run build
pm start
pm2 start app.js --name "my-app"
pm2 list, pm2 logs, pm2 restart [name] 등으로 제어가 가능합니다.
❗ 실전 트러블슈팅 사례
문제 원인 해결 방법
Nginx 502 Bad Gateway | 프라이빗 EC2에 접근 불가 | 보안 그룹 포트 3000 허용 확인 |
Node.js가 종료됨 | SSH 종료로 프로세스도 같이 종료 | PM2 사용하여 백그라운드 실행 |
EC2 접속 불가 | 키페어(.pem) 파일 문제 | 권한 400 설정 및 경로 재확인 |
✅ 배포 후 확인 리스트
- Nginx 로그 확인: /var/log/nginx/error.log
- Node.js 앱 정상 동작 여부
- 퍼블릭 IP 접근 시 UI가 정상 출력되는지
- 리소스 사용량: top, htop 등으로 모니터링
🗂️ 실습 결과 정리 팁
- 프로젝트 구조 + 배포 방식 시각화 다이어그램 만들기
- EC2 설정, Nginx 설정, PM2 명령어 등 스크린숏 + 설명 정리
- 문제 해결 경험 블로그에 정리 → 강한 포트폴리오 항목 생성
🧭 마무리 회고
이제 우리는 진짜 인터넷에 “나의 서비스”를 띄워보았습니다.
단순히 코드를 짜는 걸 넘어서, 그것을 작동하게 만들고 세상과 연결한 것입니다.
배포는 어렵고 귀찮아 보일 수 있지만, 해보면 생각보다 단순합니다.
무엇보다도 “세상에 나왔다”는 성취감은 그 어떤 기능 구현보다 짜릿합니다.
🔮 다음 편 예고
이제 서비스를 올렸다면, 다음은 CI/CD를 통한 자동화 배포입니다.
- GitHub에 Push 하면, 자동으로 EC2에 배포되는 흐름
- Docker, GitHub Actions 등 실전 도구들을 배우게 됩니다.
🌍 여러분의 서비스가 이제 진짜 세상과 연결되었습니다.
다음은 자동화라는 날개를 달아볼 차례입니다.