소소한 컴퓨터 이야기

배포 이슈 해결

by Cori

EC2에서 띄운 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

여러 설정을 바꿨는데, 확실히 배포 속도도 빨라지고 튕김 현상도 사라졌다. 

블로그의 정보

코딩하는 오리

Cori

활동하기