[Django]Nginx, gunicorn, Django 배포 시, Request 처리 속도 문제 해결

2022. 7. 22. 20:13프로젝트 로그/테스트x솔루션 JIG 개발기

반응형

Nginx, Gunicorn, Django 조합으로 웹 서비스를 배포 해서 사용하는 중, Client에서 Upload하는 4Kbytes 데이터가 다수 동시에 서버에 보내면, 서버에서 제대로 처리 하지 못하고 400 Error를 발생 시키는 문제가 있었다.

 

이를 해결하기 위한 방법으로 guniron 실행 시, 아래와 같은 명령으로 worker 갯수와 thread 갯수를 늘려 주니 서버에서 처리하는 속도가 개선되어 문제가 해결 되었다.

 

command: gunicorn --workers=5 --threads=10 config.wsgi:application --bind 0:8000

 

최종 docker-compose 파일은 아래와 같다.

version: '3.7'

services:
  nginx:
    restart: always
    build:
      context: ./nginx
      network: host
      dockerfile: Dockerfile.prod

    volumes:
      # - static_volume:/home/app/web/static
      # - media_volume:/home/app/web/media
      - ../static:/home/app/web/static
      - ../media:/home/app/web/media
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
 
    ports:
      - 80:80
      - 443:443

    depends_on:
      - web

    command : "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
  
  certbot:
      image: certbot/certbot
      container_name: certbot_service
      restart: always
      volumes:
        - ./data/certbot/conf:/etc/letsencrypt
        - ./data/certbot/www:/var/www/certbot
      depends_on:
        - nginx

      entrypoint : "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"


  web:
    build:
      context: ./django
      network: host
      dockerfile: Dockerfile.prod

    command: gunicorn --workers=5 --threads=10 config.wsgi:application --bind 0:8000
    #volumes:
      # - static_volume:/home/app/web/static
      # - media_volume:/home/app/web/media
      #- ../static:/home/app/web/static
      #- ../media:/home/app/web/media
    # ports:
    #   - 8000:8000
    expose:
      - "8000"
    env_file:
      - ./.env.prod
    # depends_on:
    #   - db

  # db:
  #   build:
  #     context: ./postgresql
  #     network: host
  #     dockerfile: Dockerfile.prod

  #   ports:
  #     - 5432:5432
  #   volumes:
  #     - postgres_data:/var/lib/postgresql/data/
  #   env_file:
  #     - ./.env.prod
    
  redis:
    build:
      context: ./redis
      network: host
      dockerfile: Dockerfile.prod

    ports:
      - 6379:6379

  rabbitmq:
    container_name: rabbitmq_service
    image: rabbitmq:3.7.14-management-alpine

    env_file:
      - ./.env.prod

    ports:
      - "5672:5672"   # RabbitMQ Default Port
      - "15672:15672" # UI Web을 위한 Port
    
# volumes:
#   postgres_data:
#   static_volume:
#   media_volume:
반응형