📋 목차
- 도메인 & DNS 설정
- Nginx 설정
- SSL 인증서 적용
1. 도메인 & DNS 설정
🔧 초기 설정
먼저 AWS Lightsail에서 고정 IP를 받고, 도메인을 연결해야 합니다.
AWS 인스턴스 고정 IP: 13.125.54.11
설정 단계:
- Lightsail 콘솔 접속
- 도메인 및 DNS → 도메인 등록 (Route53에 등록)
- 인스턴스 → 도메인 → 도메인 지정 등록
⚠️ 첫 번째 문제: 도메인 접속 불가
Route53에 도메인을 등록한 후 example.com으로 접속하면 연결이 안 됩니다.
원인:
- 도메인이 HTTP 프로토콜(
http://example.com)로 접속 - 기본 HTTP 포트인 80번으로 접속 시도
- Lightsail 네트워크 설정에서 80번 포트가 막혀있음
해결:
- Lightsail 네트워킹 탭에서 80번 포트 허용
⚠️ 두 번째 문제: 80번 포트 허용 후에도 접속 불가
80번 포트를 열어도 여전히 접속이 안 됩니다.
원인:
- Node.js 앱이 3000번 포트에서 실행 중
- 80번 포트로 들어온 요청을 3000번으로 전달해주는 포트포워딩 필요
해결 방법 비교:
| 방법 | 장점 | 단점 |
|---|---|---|
| 로드밸런싱 | AWS 관리형 서비스 | 비용 높음 (월 약 3만원) |
| Nginx ✅ | 무료, 가볍고 빠름 | 직접 설정 필요 |
→ Nginx를 선택하여 포트포워딩 구현
2. Nginx 설정
📦 Nginx 설치
SSH로 서버에 접속하여 Nginx를 설치합니다.
sudo apt install nginx
⚙️ Nginx 설정 파일 수정
설정 파일을 열어 수정합니다.
sudo nano /etc/nginx/sites-available/default
주요 설정 사항:
server_name: 도메인 설정root: 프로젝트 소스 경로 설정
server {
server_name meal.acg-playground.com;
root /home/ubuntu/acg-extension/public;
# 모든 요청 경로에 대한 처리 규칙
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;
}
# 정적 파일 처리 (디자인 소스)
location ~* \\.(js|css|png|jpg|jpeg|gif|ico|mp4|json|svg)$ {
root /home/ubuntu/acg-extension/public/;
expires max;
log_not_found off;
}
}
📝 Proxy 설정 상세 설명
각 설정의 역할:
proxy_pass <http://localhost:3000>;: 모든 요청을 3000번 포트로 전달proxy_http_version 1.1;: HTTP 1.1 프로토콜 사용proxy_set_header Upgrade $http_upgrade;: WebSocket 연결 지원proxy_set_header Connection 'upgrade';: WebSocket 추가 설정proxy_set_header Host $host;: 원래 요청의 Host 헤더 유지proxy_cache_bypass $http_upgrade;: 특정 조건에서 캐시 우회
✅ 설정 검증 및 적용
문법 오류 체크:
sudo nginx -t
Nginx 재시작:
sudo systemctl restart nginx
3. SSL 인증서 적용 (Let's Encrypt)
이제 HTTP에서 HTTPS로 업그레이드하여 보안을 강화합니다.
🔐 Certbot 설치
sudo apt install certbot python3-certbot-nginx -y
📜 SSL 인증서 발급
sudo certbot --nginx
🔄 HTTP → HTTPS 리다이렉트 설정
인증서 발급 과정에서 다음 선택지가 나타납니다:
Please choose whether or not to redirect HTTP traffic to HTTPS
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
추천: 2번 선택 → HTTP 요청을 자동으로 HTTPS로 리다이렉트
📄 자동 추가된 Nginx 설정
SSL 설정 후 Nginx 파일에 자동으로 추가되는 내용:
server {
server_name meal.acg-playground.com;
root /home/ubuntu/acg-extension/public;
location / {
# ... 기존 설정
}
location ~* \\.(js|css|png|jpg|jpeg|gif|ico|mp4|json|svg)$ {
# ... 기존 설정
}
# Certbot이 자동으로 추가한 SSL 설정
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/meal.acg-playground.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/meal.acg-playground.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
🔄 SSL 인증서 갱신 자동화
Let's Encrypt 인증서는 90일마다 갱신이 필요합니다. 자동 갱신 설정으로 편리하게 관리할 수 있습니다.
자동화 타이머 확인
sudo systemctl list-timers snap.certbot.renew.service
갱신 설정 파일 수정
sudo nano /etc/letsencrypt/renewal/meal.acg-playground.com.conf
추가할 설정:
# 만료 30일 전에 갱신하기
renew_before_expiry = 30 days
# 갱신 시 자동으로 Nginx 재시동
renew_hook = systemctl reload nginx
🎯 마무리
이제 다음과 같은 완벽한 배포 환경이 구축되었습니다:
- ✅ 도메인으로 접속 가능 (
https://meal.acg-playground.com) - ✅ Nginx를 통한 포트포워딩 (80 → 3000)
- ✅ SSL 인증서로 HTTPS 보안 통신
- ✅ 자동 인증서 갱신 설정
💡 핵심 포인트
- 포트포워딩: Nginx로 80번 포트를 앱의 3000번 포트로 연결
- SSL 인증: Let's Encrypt로 무료 SSL 인증서 발급
- 자동화: 인증서 자동 갱신으로 관리 부담 감소
🔗 참고 자료
처음 배포를 진행하시는 분들께 도움이 되었기를 바랍니다! 궁금한 점은 댓글로 남겨주세요. 🚀