Django, Gunicorn, Nginx, Docker 설정

Django, Gunicorn

  1. gunicorn 설치 및 테스트

    • pip install gunicorn
    • gunicorn —bind 0.0.0.0:8000 [project_name].wsgi:application
  2. pip freeze > requirements.txt

  3. dockerfile

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    # python version
    FROM python:3.9.6
    
    # 작업 디렉토리
    WORKDIR /usr/src/app
    
    # requirements 이동 및 설치
    COPY requirements.txt ./
    RUN pip install --upgrade pip
    RUN pip install -r requirements.txt
    
    # Project 복사
    COPY . .
    
    # *포트 설정 & gunicorn 실행은 docker-compose에서 작성*
    # 포트 설정
    # EXPOSE 8000
    
    # gunicorn 실행
    # CMD ["gunicorn", "--bind", "0.0.0.0:8000", "Django_Docker.wsgi:application"]
    
  4. docker build -t [account]/[image name]:[version] .

    • account : 사용자명, option 인 것 같다
    • image name : 이미지명
    • version : latest로 진행
  5. docker run -it -d -p 8000:8000 —name [build 명] [account]/[image name]

Nginx

  • nginx.conf

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    # [Django Project Name]/.config/nginx/nginx.conf
    # docker-compose에서 작성한 서비스 이름이 web
    upstream web {
        ip_hash;
        server web:8000;
    }
    
    server {
        listen 80;
        server_name localhost;
        charset utf-8;
        client_max_body_size 128M;
    
        location / {
            proxy_pass http://web/;
        }
    
        location /static/ {
            alias /static/;
        }
    }
    
  • static 파일 처리하기

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # settings.py
    ...
    BASE_DIR = Path(__file__).resolve().parent.parent
    ...
    STATIC_URL = '/static/'
    STATIC_DIR = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = [
        STATIC_DIR,
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, '.static')
    ...
    

docker-compose

  1. docker-compose.yml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    version: "3"
    services:
      nginx:
        image: nginx:latest
        container_name: nginx
        ports:
        - "80:80/tcp"
        volumes:
        - ./.config/nginx:/etc/nginx/conf.d
        - ./.static:/static
        depends_on:
          - web
    
      web:
        build:
          context: .
          dockerfile: dockerfile
        container_name: web
        command: gunicorn Django_Docker.wsgi:application --bind 0.0.0.0:8000
        volumes:
        - ./static:/user/src/app/staticfiles
        expose:
          - "8000"
    
  2. docker-compose up

    • docker-compose up --build : image까지 같이 생성

환경변수 설정 feat.DB info

Django의 DB 정보를 환경변수로 등록하여 사용하기 위해 필요

  • .env

    • 최상위 프로젝트 폴더에 저장
    • 띄어쓰기가 있으면 안됨
    1
    2
    3
    
    DB_ENV_MARIADB_USER="계정 아이디"
    DB_ENV_MARIADB_PASSWORD="계정 비밀번호"
    DB_ENV_MARIADB_HOST="HOST 주소"
    
  • docker-compose.yml

    1. 자동으로 인식해서 가져오는 방법
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    api:
        build:
          context: .
          dockerfile: dockerfile-dev
        container_name: dayou_api
        command: gunicorn Django_Docker.wsgi:application --bind 0.0.0.0:8000
        environment:
          DB_ENV_MARIADB_USER: "${DB_ENV_MARIADB_USER}"
          DB_ENV_MARIADB_PASSWORD: "${DB_ENV_MARIADB_PASSWORD}"
          DB_ENV_MARIADB_HOST: "${DB_ENV_MARIADB_HOST}"
        volumes:
        - ./static:/user/src/app/staticfiles
        expose:
          - "8000"
    
  1. env 파일을 명시해주는 방법
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
api:
    build:
      context: .
      dockerfile: dockerfile
    container_name: web
    command: gunicorn Django_Docker.wsgi:application --bind 0.0.0.0:8000
    env_file:
       - .env
    volumes:
	    - ./static:/user/src/app/staticfiles
    expose:
      - "8000"
  • Django settings.py
    • os.getenv(‘환경변수’)로 변수값 가져오기
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mysql',
            'USER': os.getenv('DB_ENV_MARIADB_USER'),
            'PASSWORD': os.getenv('DB_ENV_MARIADB_PASSWORD'),
            'HOST': os.getenv('DB_ENV_MARIADB_HOST'),
            'PORT': '3306',
        }
    }
    
Hugo로 만듦
JimmyStack 테마 사용 중