2개 이상의 Fastapi 웹 애플리케이션 서버에 트래픽을 적절히 분산하고, 네트워크 안정성을 높이는 nginx를 함께 구축하고 배포할 수 있도록 docker-compose를 통해 구현해 보자.
nginx는 경량 웹 서버 소프트웨어로, 클라이언트-서버 모델을 기반으로 한다.
nginx는 다음과 같은 특징을 가진다.
nginx는 다음과 같은 서비스에 적용될 수 있다.
현재 프로젝트에서 나는 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;
}
}
}
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개가 생성되며 네트워크 통신이 연결되는 것을 확인할 수 있다.