[docker] FastAPI-Nginx 를 docker-compose로 배포하기

조하운·2023년 6월 2일
0
post-thumbnail

❓목표

2개 이상의 Fastapi 웹 애플리케이션 서버에 트래픽을 적절히 분산하고, 네트워크 안정성을 높이는 nginx를 함께 구축하고 배포할 수 있도록 docker-compose를 통해 구현해 보자.

1. Nginx 란?(개념, 필요성, 아키텍처)

nginx는 경량 웹 서버 소프트웨어로, 클라이언트-서버 모델을 기반으로 한다.

nginx는 다음과 같은 특징을 가진다.

  1. 가볍고, 동시 트래픽이 많은 네트워크 환경일수록 효율적으로 동작한다. 이를 통해 웹 서버의 응답 시간을 단축시키고, 로드 타임을 개선할 수 있다.
  2. 주로 리버스 프록시 서버, 로드 밸런서, 캐시 서버의 용도로 사용된다.
  3. Nginx는 오픈 소스로 제공되고, 다양한 OS에서 지원한다.

nginx는 다음과 같은 서비스에 적용될 수 있다.

  1. HTML, CSS, JavaScript 등 정적 파일을 클라이언트 요청에 대한 응답으로 빠르게 응답해야 할 때
  2. 웹 서버에 대한 클라이언트 요청을 웹 애플리케이션 서버로 전달할 때 서버의 보안을 강화하고 로드 밸런싱을 적용하고자 할 때
  3. 여러 대의 서버를 운용할 때 트래픽을 분산시키고 싶을 때
  4. SSL/TLS 암호화 프록시 서버의 기능을 사용할 때 : SSL/TLS 인증서의 관리 가능
  5. 동일한 서버에서 여러 개의 도메인 또는 서브도메인을 가상으로 호스팅할 때 라우팅 기능을 위해

2. nginx 이미지를 빌드하고 nginx.conf 파일 작성하기

현재 프로젝트에서 나는 2개의 fastapi 서버를 사용할 계획이다. 각 서버는 외부로부터 8001, 8002 포트에 들어오는 요청을 8000 포트로 포워딩할 것이다.
이를 위해서는 nginx의 config 파일을 작성해줘야 한다.

nginx.conf


user  nginx;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    client_body_buffer_size 10m;
    sendfile on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 100;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    upstream fastapi {
        server fastapi1(서버이름):8000;
        server fastapi2(서버이름):8000;
    }
    server {
        listen 8080;
        server_name haunserver.shop(도메인 네임);
        location / {
            proxy_pass         http://fastapi;
            proxy_redirect     off;
            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_buffering    off;
        }
    }
}

3. docker-compose로 빌드하기 위한 docker-compose.yaml 작성하기

version: "3.7"
services:
  nginx:
    image: nginx
    ports:
      - "8080:8080"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - fastapi1
      - fastapi2
    networks:
      - my_network

  redisai:
    image: redislabs/redisai
    networks:
      - my_network
    ports:
      - "6379:6379"
    volumes:
      - ./app/models/yolov7.pt:/models/yolov7.pt
      - ./app/models/ViT-B-32.pt:/models/ViT-B-32.pt


  fastapi1:
    build:
      context: .
      dockerfile: dockerfile
      args:
        - LIBGL_PATH=/usr/lib/x86_64-linux-gnu/libGL.so.1
    
    ports:
      - "8001:8000"
    depends_on:
      - redisai
    networks:
      - my_network

  fastapi2:
    build:
      context: .
      dockerfile: dockerfile
      args:
        - LIBGL_PATH=/usr/lib/x86_64-linux-gnu/libGL.so.1
    
    ports:
      - "8002:8000"
    depends_on:
      - redisai
    networks:
      - my_network
networks:
  my_network:

*위 yaml 파일은 내가 프로젝트를 진행하기 위해 작성한 코드이기 때문에 defalut는 아니다. 그래서 세부적인 사항은 본인이 구현하고자 하는 서비스에 맞게 수정해야 한다.

위와 같이 .conf 파일과 .yaml 파일을 작성한 뒤

$ docker-compose up --build 를 실행하면 성공적으로 컨테이너 3개가 생성되며 네트워크 통신이 연결되는 것을 확인할 수 있다.

profile
| 컴퓨터 비전 | 딥 러닝 | 자율주행 |

0개의 댓글