Docker DRF Nginx Gunicorn 배포 환경 구축

정규호·2024년 1월 16일
0

Docker Compose - services 서비스 배포

version: '2.23.1'
services:
  web:
    image: nginx:latest
    # ports:- "8080:80" 과 동일
    ports:
      - target: 80
        published: 8080
        protocol: tcp
        mode: HOST
    # 개발되는 서비스를 스케일링 하기 위한 옵션
    deploy:
      mode: replicated
      replicas: 3 # 확장 시키고자 하는 노드의 개수
      resources: # 지정하고자 하는 리소스 구성 수펙
        limits: # cpu와 메모리 제한
          cpus: "0.5" # cpu를 전체 비율로 할당
          memory: 50M # memory를 50메가바이트로 설정
      restart_policy: # 재시작 정책
        condition: on-failure # 실행이 실패했을 시 재시작       

출처 : [🐋Docker] 도커 컴포즈(Docker Compose)

Deployments
애플리케이션 모델의 배포를 지원하는 Compose 구현에는 Compose 애플리케이션 모델이 서비스당 실제 인프라 요구 사항 또는 수명 주기 제약 조건을 반영하기에는 너무 추상적이기 때문에 일부 추가 메타데이터가 필요할 수 있습니다(MAY).
Compose 사양 배포를 통해 사용자는 서비스에 대한 추가 메타데이터를 선언할 수 있으므로 Compose 구현은 관련 데이터를 가져와 플랫폼에 적절한 리소스를 할당하고 사용자의 요구에 맞게 구성할 수 있습니다.

  • replicas: 서비스 인스턴스의 수를 지정합니다.
  • placement: 서비스 인스턴스를 배치할 노드를 선택하는 규칙을 지정합니다.
  • update_config: 서비스 업데이트를 제어하는 옵션을 지정합니다.
  • resources: 서비스 인스턴스가 사용할 CPU 및 메모리 등의 자원을 지정합니다.
  • networks: 서비스가 연결할 네트워크를 지정합니다.
version: '3.7'
services:
  web:
    image: nginx:latest
    deploy:
      replicas: 3
      placement:
        constraints:
          - node.role == manager
      update_config:
        parallelism: 2
        delay: 10s
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
      networks:
        - frontend
        - backend
networks:
  frontend:
  backend:

위의 예시는 다음과 같다고 한다.
위의 예시에서는 "web" 서비스를 배포할 때, "deploy" 옵션을 사용하여 다양한 설정을 지정하고 있습니다.
예를 들어, "replicas" 옵션을 사용하여 3개의 서비스 인스턴스를 생성하고, "placement" 옵션을 사용하여 매니저 노드에서만 서비스 인스턴스를 배치하도록 지정하고 있습니다.
또한 "update_config" 옵션을 사용하여 서비스 업데이트를 제어하고, "resources" 옵션을 사용하여 서비스 인스턴스가 사용할 자원을 제한하고 있습니다. 마지막으로 "networks" 옵션을 사용하여 서비스가 연결할 네트워크를 지정하고 있습니다.

출처 : Docker) Docker Compose에 대해서 간단하게 알아보기

  1. 리소스 사용 확인
    제한을 설정한 후 docker stats 명령을 사용하여 제한을 확인할 수 있다.
$ docker stats
CONTAINER ID        NAME                                             CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
8ad2f2c17078        bael_stack_service.1.jz2ks49finy61kiq1r12da73k   0.00%               2.578MiB / 512MiB   0.50%               936B / 0B           0B / 0B             2

출처 : Docker에서 메모리 및 CPU 제한 설정

출처 : NGINX의 설정에 대해 쉽게 알아보자.

NGINX는 기본적으로 하나의 Worker Process당 1024개의 커넥션을 처리합니다. 예를 들어, Worker Process가 2면 2048개의 커넥션을 처리할 수 있고, 3이면 3072개, 4이면 4096개를 처리합니다. 즉, 커넥션이 부족한 상황이라면 worker connections 또는 worker Process를 늘려줘야 합니다.

  1. nginx.conf
    NGINX의 기본 설정 파일입니다.
[user@server /]# cat /etc/nginx/nginx.conf 
user  nginx;
worker_processes  auto; <= cpu cores 에 따라 설정
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024; <= worker_Porcesses 하나가 한 번에 처리할 수 있는 연결 수
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

출처 : NGINX Worker Connection, Worker Process 개념

출처 : NGINX 성능을 위해 최적화하기

출처 : [배포] 8. NginX & Gunicorn

출처 : [감정일기] 1. Docker-Compose로 Django, Nginx, Gunicorn 연결후 AWS에 배포하기

출처 : Python 성능 극대화, 2부: NGINX Load Balancing 및 모니터링

출처 : gunicorn - 실행하기

출처 : [WSGI] Gunicorn 기본 설정

profile
The Man Who Lift

0개의 댓글

관련 채용 정보