Gunicorn과 Nginx 사용하기

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

개발 중에는 장고가 기본적으로 제공하는 runserver를 이용해도 큰 문제가 없지만, 실제로 운영할 때 방문자가 많아지면, 성능 보안상의 문제가 있을 수 있다.
이런 상황에 대비하기 위해 Nginx, Apache 등의 웹 서버 소프트웨어를 사용한다.


웹 서버 소프트웨어를 사용하는 이유

1. 더 빠른 응답

2. 많은 사용자가 동시에 접속했을 때 여러 대의 서버로 요청을 분산시키는 로드 밸런싱

3. 장고가 꼭 필요한 요청에 대해서만 장고를 이용해 자원을 효율적으로 사용할 수 있다.


Gunicorn 적용하기

Gunicorn은 웹 서버 소프트웨어와 장고를 연결하는 WSGI 중 하나이다.

Guniconr을 사용해 서버를 실행하기 위해 docker-compose.yml 파일의 web 컨테이너를 다음과 같이 수정한다.

# docker-compose.yml
version: '3'

services:
  web:
    build: .
    command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./:/usr/src/app/
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=do_it_django_db_user
      - POSTGRES_PASSWORD=do_it_django_db_password
      - POSTGRES_DB=do_it_django_dev

volumes:
  postgres_data:

pip install gunicorn으로 설치한 뒤, pip freeze > requirements.txt로 이미지에 반영한다.

docker-compose up --build -d 로 빌드와 실행을 한번에 명령한다.


정적 파일 서비스하기

Gunicorn을 사용하며 더 이상 앱 폴더의 static 폴더에서 직접 파일을 연결하지 않았기 때문이다.

settings.py에 STATIC_ROOT의 경로를 지정해준다.

# settings.py
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, '_media')
STATIC_ROOT = os.path.join(BASE_DIR, '_static')

STATIC_URL이 프로젝트의 urls.py 단에서도 처리가 되도록 urls.py에 한 줄 추가한다.

# urls.py
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

실행중인 컨테이너를 종료하고 python manage.py collectstatic을 수행해 static 파일을 복사한다.

도커 이미지를 다시 빌드하고 실행하면 css 등이 잘 적용되어 있다.