배포 이슈 해결
by CoriEC2에서 띄운 Instance (t3.micro)에서, 직접 build 하다 보니 부족한 RAM으로 인해 OOM 현상이 발생하고, 인스턴스에 접속이 안 되는 문제까지 발생하였다. 이러한 문제를 해결하는 과정에서 겪은 일들을 여기에 포스팅하여 나중에 참고하려 한다.
1. EC2 Instance, Docker compose 팅김 현상
RAM 1GB로 npm ci + npm run build 실행으로 인한 메모리 부족이 원인으로, 로컬에서 빌드한 후 scp로 build/ 폴더만 EC2 Instance에 전송한다. 이후 도커파일에서 빌드 단계를 제거한다.
# 변경 전 — EC2에서 빌드
FROM node:20-alpine AS builder
RUN npm ci && npm run build
# 변경 후 — 로컬 빌드 결과물만 복사
FROM nginx:alpine
COPY build /usr/share/nginx/html
2. 로컬 nginx와 Docker nginx 80번 포트 충돌
도커 파일 내부에서 nginx 를 쓰느라 로컬에 있는 nginx 파일과 충돌하는 일이 발생했다. 이를 해결하기 위해 docker-compose.yml 포트를 3000:80으로 변경하고, 호스트 nginx가 리다이렉팅을 하도록 proxy_pass를 설정해주었다.
# sites nginx 파일 생성
sudo nano /etc/nginx/sites-available/{your site name}
# 내용 작성
server {
listen 80;
server_name {your domain.com} www.{your domain.com};
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name {your domain.com} www.{your domain.com};
ssl_certificate /etc/letsencrypt/live/{your domain.com}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{your domain.com}/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
이렇게 작성해준 후 다음과 같이 반영해주자.
sudo ln -s /etc/nginx/sites-available/{your site name} /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
3. Docker Container nginx에 SSL 설정 남아있던 문제
기존 Docker용 nginx.conf 파일은 이랬다.
server {
listen 80;
return 301 https://$host$request_uri; # 80 → https 리다이렉트
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/...; # 인증서 경로
root /usr/share/nginx/html;
}
해당 파일은 호스트용 (sites-available) 이었는데, Docker 컨테이너 안에도 그대로 들어가면서 다음 두 가지 문제가 발생했다: 호스트 nginx가 proxy_pass http://localhost:3000으로 Docker에 요청을 넘기면, Docker nginx가 또 https://로 리다이렉트를 시도. 인증서(/etc/letsencrypt/...)는 호스트 EC2에만 있고 Docker 컨테이너 안엔 없음.
이를 해결하기 위해, 도커용 nginx.conf 파일을 다음과 같이 SSL도 없고, 리다이렉트도 없고, 그냥 파일 서버 역할만 하도록 바꿔주었다.
server {
listen 80;
server_name _; # 도메인 신경 안 씀
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
4. JS/CSS 파일 403 Permission denied
scp로 전송한 파일 권한이 좁아 Docker 내 nginx가 읽지 못하는 문제가 발생하였기에, Dockerfile에 chmod를 추가해주었다.
RUN chmod -R 755 /usr/share/nginx/html
여러 설정을 바꿨는데, 확실히 배포 속도도 빨라지고 튕김 현상도 사라졌다.
'CS > Server' 카테고리의 다른 글
| 웹사이트 검색 최적화 (SEO, Search Engine Optimization) (0) | 2026.05.08 |
|---|---|
| 홈페이지 웹 배포 (0) | 2026.05.04 |
| CGI, Fast CGI (0) | 2025.05.28 |
| 서버에서 실시간 로그 확인하기 (0) | 2025.03.17 |
| 알아두면 쓸데있는 Ubuntu 명령어 모음 (1) | 2024.09.25 |
블로그의 정보
코딩하는 오리
Cori