AWS EC2와 NGINX를 사용하여 Node.js 서버 배포하기
요약
본 가이드는 AWS EC2와 NGINX를 활용하여 로컬의 Node.js 애플리케이션을 클라우드 환경에 배포하는 과정을 안내합니다. SSH 연결, Node.js 설치 및 PM2를 이용한 프로세스 관리 방법을 다루며, NGINX 리버스 프록시 설정을 통해 외부 접근성을 확보하는 것이 핵심입니다.
핵심 포인트
- AWS EC2 인스턴스를 생성하고 보안 그룹을 설정하여 방화벽 역할을 수행하게 합니다.
- SSH 키와 공개 IP를 사용하여 안전하게 서버에 접속하고 환경을 준비합니다.
- PM2를 이용해 Node.js 애플리케이션이 지속적으로 실행되도록 관리하는 것이 중요합니다.
- NGINX를 리버스 프록시로 구성하여 외부 HTTP 요청을 내부 Node.js 서비스로 전달합니다.
로컬에서 실행되는 Node.js 애플리케이션이 있다면, AWS EC2 서버에 배포하여 인터넷을 통해 접근할 수 있도록 만들 수 있습니다.
본 가이드에서는 다음 내용을 다룹니다:
- AWS EC2 인스턴스 생성
- SSH를 사용하여 서버 연결
- Node.js 설치
- Node.js 애플리케이션 실행
- 애플리케이션을 지속적으로 유지하기 위해 PM2 사용
- NGINX 설치
- 리버스 프록시로 NGINX 구성
- AWS 방화벽 구성
- EC2 공개 IP를 사용하여 Node.js 애플리케이션 접근
이 과정을 마치면 아키텍처는 다음과 같은 형태가 됩니다:
User
|
| HTTP 요청
...
1. EC2 인스턴스 생성
AWS 콘솔로 이동하여 EC2를 엽니다.
새 인스턴스를 생성합니다.
이 튜토리얼의 경우 다음을 사용할 수 있습니다:
AMI: Ubuntu
인스턴스 유형: t2.micro 또는 t3.micro
저장 공간: 8 GB 이상
인스턴스를 생성할 때 SSH 키 쌍을 만들거나 선택하는 것을 잊지 마세요.
.pem 파일을 다운로드하여 안전하게 보관하세요.
서버에 연결하는 데 필요합니다.
2. 보안 그룹 구성
EC2 보안 그룹은 방화벽처럼 작동합니다.
다음 인바운드 규칙을 추가하세요:
| 유형 | 포트 | 소스 |
|---|---|---|
| SSH | 22 | 내 IP |
| ... |
테스트를 위해 HTTP의 경우 0.0.0.0/0를 사용할 수 있습니다.
SSH의 경우, 모든 사람에게 포트 22를 열기보다는 자신의 IP만 허용하는 것이 좋습니다.
3. SSH를 사용하여 EC2 연결
인스턴스가 시작된 후, 공개 IPv4 주소를 복사합니다.
다음과 같은 형태일 것입니다:
13.234.XX.XX
터미널을 열고 .pem 파일이 있는 디렉토리로 이동합니다.
Linux 또는 macOS의 경우:
chmod 400 my-key.pem
그런 다음 연결합니다:
ssh -i my-key.pem ubuntu@YOUR_EC2_PUBLIC_IP
예시:
ssh -i my-key.pem [email protected]
모든 것이 작동하면, 이제 EC2 서버 내부에 있게 됩니다.
4. 서버 업데이트
먼저 패키지 목록을 업데이트합니다:
sudo apt update
그런 다음 기존 패키지를 업그레이드합니다:
sudo apt upgrade -y
5. Node.js 설치
가장 쉬운 방법은 NodeSource를 사용하는 것입니다.
먼저 curl을 설치합니다:
sudo apt install curl -y
```}**{
Node.js를 설치합니다.
예를 들어:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
Node.js 설치:
sudo apt install nodejs -y
설치 확인:
node -v
그리고:
npm -v
설치된 Node.js 및 npm 버전을 확인할 수 있습니다.
## 6. Node.js 애플리케이션 가져오기
애플리케이션을 EC2 서버에 올리는 방법은 여러 가지가 있습니다.
예를 들어, 프로젝트가 GitHub에 있는 경우:
git clone https://github.com/USERNAME/REPOSITORY.git
프로젝트로 이동합니다:
cd REPOSITORY
의존성을 설치합니다:
npm install
애플리케이션이 환경 변수를 필요로 하는 경우, `.env` 파일을 생성합니다:
nano .env
환경 변수를 추가하고 파일을 저장합니다.
## 7. Node.js 서버 실행하기
Node.js 애플리케이션에 다음과 같은 내용이 포함되어 있다고 가정해 봅시다:
const express = require("express");
const app = express();
...
실행합니다:
node server.js
다음과 같은 메시지가 표시되어야 합니다:
Server running on port 3000
애플리케이션이 다음에서 실행되고 있습니다:
하지만, 사용자들에게 포트 `3000`을 사용하여 애플리케이션에 접근하도록 하고 싶지는 않습니다.
여기에 NGINX가 필요합니다.
## 8. 왜 NGINX가 필요한가?
Node.js 애플리케이션을 직접 노출하는 대신, 그 앞에 NGINX를 배치할 수 있습니다.
사용자는 다음 주소로 요청을 보냅니다:
NGINX는 포트 `80`에서 요청을 받습니다.
NGINX는 내부적으로 다음으로 요청을 전달합니다:
흐름은 다음과 같이 됩니다:
Browser
|
| :80
...
이것을 **리버스 프록시(reverse proxy)**라고 합니다.
## 9. NGINX 설치하기
NGINX를 설치합니다:
sudo apt install nginx -y
상태를 확인합니다:
sudo systemctl status nginx
실행 중이라면 다음과 유사한 내용을 볼 수 있습니다:
Active: active (running)
또한, 서버 부팅 시 NGINX가 자동으로 시작되도록 활성화할 수도 있습니다:
sudo systemctl enable nginx
## 10. NGINX를 리버스 프록시로 구성하기
NGINX 설정 파일은 보통 다음 위치에 저장됩니다:
/etc/nginx/
애플리케이션을 위해 새로운 설정을 만듭니다:
sudo nano /etc/nginx/sites-available/nodeapp
다음 내용을 추가합니다:
server {
listen 80;
...
파일을 저장합니다.
## 11. 설정 활성화하기
심볼릭 링크를 생성합니다:
sudo ln -s /etc/nginx/sites-available/nodeapp /etc/nginx/sites-enabled/
기본 NGINX 설정은 충돌을 일으킬 수 있으므로 제거합니다:
sudo rm /etc/nginx/sites-enabled/default
NGINX를 재시작하기 전에 설정을 테스트합니다:
sudo nginx -t
다음과 같이 표시되어야 합니다:
syntax is ok
test is successful
이제 NGINX를 재시작합니다:
sudo systemctl restart nginx
## 12. PM2로 Node.js 실행 유지하기
하나의 문제가 있습니다.
만약 다음 명령을 실행하고 SSH 연결을 끊으면 애플리케이션이 중지될 수 있습니다:
node server.js
우리는 프로세스 매니저가 필요합니다.
PM2를 설치합니다:
sudo npm install -g pm2
애플리케이션을 시작합니다:
pm2 start server.js --name nodeapp
프로세스를 확인합니다:
pm2 status
다음과 같이 표시되어야 합니다:
nodeapp online
PM2 프로세스 목록을 저장합니다:
pm2 save
서버 재부팅 후 PM2가 자동으로 시작되도록 구성합니다:
pm2 startup
PM2가 명령어를 제공할 것입니다.
그 명령어를 복사하여 실행합니다.
그런 다음 다음을 실행합니다:
pm2 save
이제 Node.js 애플리케이션은 서버 재부팅 후 자동으로 다시 시작될 수 있습니다.
## 13. 애플리케이션 접속하기
브라우저를 열고 다음 주소로 방문합니다:
예시:
요청 흐름은 이제 다음과 같습니다:
Internet
|
↓
...
포트 `3000`을 외부에 노출할 필요가 없습니다.
NGINX는 다음 내부 경로를 통해 Node.js와 통신합니다:
localhost:3000
## 14. 중요한 AWS Security Group 구성
이 시점에서 EC2 보안 그룹은 다음과 유사해야 합니다:
SSH 22 Your IP
HTTP 80 0.0.0.0/0
HTTPS 443 0.0.0.0/0
포트 `3000`을 인터넷에 노출할 필요는 없습니다.
이것은 중요한 차이점입니다:
Public:
Internet → NGINX :80
...
## 15. 유용한 NGINX 명령어
NGINX 상태 확인:
sudo systemctl status nginx
NGINX 시작:
sudo systemctl start nginx
NGINX 중지:
sudo systemctl stop nginx
NGINX 재시작:
sudo systemctl restart nginx
설정 테스트:
sudo nginx -t
## 16. 유용한 PM2 명령어
애플리케이션 확인:
pm2 status
로그 보기:
pm2 logs
애플리케이션 재시작:
pm2 restart nodeapp
애플리케이션 중지:
pm2 stop nodeapp
애플리케이션 삭제:
pm2 delete nodeapp
## 17. 일반적인 문제
### NGINX에서 502 Bad Gateway 표시
`502 Bad Gateway`는 일반적으로 NGINX가 Node.js 애플리케이션에 도달할 수 없음을 의미합니다.
Node.js가 실행 중인지 확인하세요:
pm2 status
또한 EC2 서버에서 애플리케이션을 직접 테스트할 수도 있습니다:
만약 이 명령이 애플리케이션 응답을 반환하지 않는다면, 먼저 Node.js 애플리케이션을 수정해야 합니다.
### NGINX 설정 오류
다음 명령을 실행하세요:
sudo nginx -t
어떤 부분에서 설정 문제가 발생했는지 알려줄 것입니다.
### EC2 IP에 접근할 수 없음
AWS 보안 그룹을 확인하세요.
포트 `80`이 허용되어 있는지 확인해야 합니다.
또한 NGINX도 확인하세요:
sudo systemctl status nginx
### Node.js 애플리케이션 중지됨
PM2를 확인하세요:
pm2 status
그런 다음 로그를 확인하세요:
pm2 logs nodeapp
## 18. 최종 아키텍처
모든 것을 완료한 후, 배포는 다음과 같은 모습을 갖게 됩니다:
INTERNET
|
|
...
중요한 아이디어는 간단합니다:
**NGINX가 들어오는 HTTP 요청을 처리하고, Node.js가 애플리케이션 로직을 처리합니다.**
나중에 Let's Encrypt와 Certbot을 사용하여 이 설정 위에 도메인 이름과 HTTPS를 추가할 수 있습니다.
## 결론
이제 NGINX가 리버스 프록시 역할을 하는 AWS EC2 서버에서 Node.js 애플리케이션을 실행하는 방법을 알게 되었습니다.
기본적인 프로덕션 흐름은 다음과 같습니다:
User
↓
Domain / Public IP
...
이 설정은 Docker, 로드 밸런서(load balancers), CI/CD, Kubernetes와 같은 더 고급 도구로 넘어가기 전에 실제 서버 배포를 학습하기 위한 좋은 기반입니다.
비디오 워크스루가 필요하신가요?
과정을 시각적으로 따라 하는 것을 선호하시면, 이 비디오에서도 배포 과정을 더 자세히 설명했습니다: [https://www.youtube.com/watch?v=4cgvi_uCKiA](https://www.youtube.com/watch?v=4cgvi_uCKiA)
자세한 AWS EC2 + NGINX + Node.js 배포 비디오를 시청하세요.
이 글과 함께 비디오를 따라하면서 각 명령을 EC2 인스턴스에서 직접 실행할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기