AI/AI 서비스 개발

[AI 서비스 개발] Nginx, AWS EC2, docker-compose로 배포하기

brave_sol 2025. 1. 30. 19:58

1. Nginx란?

- 가볍고 빠르며 높은 동시 접속 처리 능력을 갖춘 고성능 웹서버 및 리버스 프록시 서버

- 보안 기능을 강화해 안전한 웹사이트 운영 가능

- 즉, 웹사이트를 빠르게 보여주는 프로그램

 

2. 리버스 프록시란?

- 서버로 들어오는 요청을 가로채는 프로그램, 여러 개의 애플리케이션 서버 앞단에서 로드 밸런서 역할을 수행

- 유저가 서버로 바로 연결되는게 아니라 리버스 프록시가 받아서 서버로 안내함

- 서버 정보를 숨길 수 있고, https 인증서 설치가 쉽고, 로드 밸런싱 가능, 로그 남기기 IP차단 등의 장점

 

3. 로드 밸런싱이란?

- 여러 개의 백엔드 서버에 요청을 분배하여 성능을 향상시키고 가용성을 높임

- 트래픽을 나누어 부하를 줄여줌

 

4. 웹서버란?

- 사용자가 주소창에 www.naver.com 입력 > 브라우저는 필요한 THML, CSS, JS파일을 NAVER 서버에 요청

- 브라우저가 NAVER 서버로부터 파일 다운로드 후 해석해서 웹사이트를 화면에 띄워줌

=> 웹서버반? 사용자의 요청(www.xxx~)이 들어올 때마다 HTML, 이미지 등 파일을 제공하는 컴퓨터

=> nignx를 활용하면 웹사이트를 배포할 수 있다.

 

- naver서버에서 가져온 파일들 확인 : 마우스 우클릭 > 검사 > 네트워크

 

5. AWS EC2설치

- aws 계정 회원가입 (카드정보 기입 필요, 프리티어 무료 사용) : https://aws.amazon.com/ko/

- 리전선택(서울: 주 사용자 국가) > EC2 인스턴스 시작하기 클릭 > 이름 작성 > Ubuntu선택 > 인스턴스 유형 t2.micro선택 > 키페어 없이 계속 선택 (실 서비스시에는 있어야함) > 보안에서 HTTPS, HTTP 트래픽 허용 선택 > 인스턴스 시작!

* EC2란?

- Elastic Computer Cloud, 하나의 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스

- 프론트, 백엔드 구분 없이 쓸 수는 있지만 주로 백엔드에 사용하나, 프론트는 S3를 많이 쓴다.

- S3는 저장 공간만 사용하기 때문에 정적 파일만 제공할 수 있다

- EC2는 서버에서 동적인 로직을 실행해야 하기 때문에 가상의 서버를 사용한다.(인스턴스 실행 시간에 따라 과금)

- 인스턴스 중지는 EBS(스토리지) 비용이 발생하기 때문에, 실습용으로 쓰고 사용하지 않는다면 종료(삭제) 권장

-  퍼블릭 IPv4 주소 : 외부에서 접속할 수 있음

 

6. AWS EC2에 nginx 설치

- 내가 선택한 리전 > 인스턴스 생성한거 ID 클릭 > 연결 > 연결 > 검은 화면(리눅스 화면) 나옴

* 기본 명령어

- sudo : 관리자 권한으로 실행할 수 있도록 하는 명령어
- apt : 패키지 설치 도구 (npm, pip 같은거)
- curl : 데이터를 URL을 통해 전송할 수 있도록 도와주는 명령어
- cd : 폴더 이동
- ls : 현재 폴더 안의 파일과 폴더 목록 조회 
- tail 마지막(가장 최근에 추가된) 내용 10개 조회
- systemctl : 시스템 및 서비스 관리자를 다루는데 사용(서비스 시작, 부팅 등)

 

- 다음 명령어들을 하나씩 실행. 복붙은 crtl+v 대신 shift+insert

sudo apt update

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring 
y

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee / usr/shar/keyrings/nginx-archive-keyring.gpg >/dev/null

sudo apt update

# 엔진엑스 설치
sudo apt install nginx
y

# 잘 설치 되었는지 확인
sudo systemctl status nginx

# inactive라면
sudo systemctl start nginx

  

- 밑에 PublicIPs에 있는 주소 복붙 후 인터넷 주소창에 입력, 밑에 페이지가 나오면 잘 실행되고 있다는 것을 알 수 있음

 

7. Nignx 로그 확인하는 방법(디버깅)

- 개발할 때 콘솔창을 자주 확인하는데, 리눅스에서는 콘솔창 역할을 하는 것이 로그파일이다.

cd /var/log/nginx

ls

# access.log 파일의 마지막 10줄 출력
tail access.log

# 실시간 출력
tail -f access.log

 

8. IP와 Port

- IP : 네트워크 상에서 특정 컴퓨터를 가리키는 주소

- Port : 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소

- 잘 알려진 포트: 0 ~ 1023번까지는 주요 통신을 위한 규약에 따라 이미 정해져 있다.

- 22번 : SSH(Secure Shell Protocol) 원격 접속을 위한 포트 번호
- 80번 : HTTP로 통신을 할 때 사용
- 443번 : HTTPS로 통신을 할 때 사용

 

9. 스토리지

- EBS(Elastic Block Storage) : EC2에서 쓰는 일종의 하드디스크 

- 프리티어는 30GB 까지 무료

 

10. 보안그룹 > 포트 설정

- 허용할 포트 지정, 나는 프론트를 8080으로 지정해줘서 8080을 추가해줬다.

 

11. docker-compose 파일 생성

services:
  backend:
    build:
      context: ./back
      dockerfile: Dockerfile
    container_name: backend
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=${DATABASE_URL}

  frontend:
    build:
      context: ./front
      dockerfile: Dockerfile
    container_name: frontend
    ports:
      - "8080:80"

  db:
    image: mysql:8.0
    container_name: db
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

 

12.  docker-compose로 배포하기

- 인스턴스 연결 후

sudo apt update

# 도커 설치
sudo apt install docker.io
sudo apt install docker-compose
docker --version

# git 설치 확인
git --version

# 내 깃허브에서 레퍼지토리 복사
git clone 레포지주소

# 다운받은거 확인
ls -a

# 다운받은 레포지로 이동
cd 레포지토리이름

# .env 파일 생성 및 내용 입력
sudo vim .env

# 내용 입력 후 저장 및 종료
:wq

# 작성한 내용 확인
cat .env

# docker 실행
sudo systemctl start docker

# docker compose 실행
sudo docker-compose up --build

# docker 실행 확인
sudo docker ps

# docker compose 종료
sudo docker-compose down
반응형