Django 배포 설정
by VICENTE97P4
Dec. 20, 2021, 10:06 p.m.
Django로 앱을 만들고 배포를 할 때는 몇 가지 설정을 해줘야 합니다.
이번 포스팅에서는 아래 3가지를 알아봅시다.
- Debug 설정
- ENV 설정
- Gunicorn 설치
Debug 설정
장고는 개발환경에서 debug가 True로 되어있습니다.
Debug는 말 그대로 버그를 찾아내는 기능이라서 User가 사용하는 웹 앱에
debug 설정이 되어있다면, user가 보면 안 되는 log까지 보게 됩니다. 그래서 False로 바꿔주어야 합니다.
ENV 설정
ENV는 이 앱을 실행하는 환경이 로컬인지, production level인지, development stage인지를 설정합니다.
settings.py 파일에서 설정을 바꿔줍니다.
첫 줄은 os 환경번수(os.environ)에서 'DJANGO_ENV'를 가져오라는 명령어입니다.
이때, get 함수로 'DJANGO_ENV'가 없으면 'dev'를 가져오게 합니다.
우리는 컴퓨터에 DJANGO_ENV라는 환경변수를 설정하지 않았기 때문에 ENV에 dev가 들어가게 됩니다.
그래서 개발환경 컴퓨터에서는 DEBUG를 True로, 아니면 False로 설정할 수 있습니다.
(물론 개발환경 컴퓨터에서 일부러 DJANGO_ENV 환경변수를 만들면 DEBUG=False가 됩니다.)
그리고 밑 부분에 ALLOWED_HOSTS가 있습니다.
만일 우리가 abc.com이라는 도메인을 가지고 있다고 생각해봅시다.
그럼 abc.com으로 들어온 요청만 받게 됩니다.
만일 abcd.com으로 요청이 들어오면 장고가 자동으로 차단합니다.
그런데 우리는 모든 호스트가 접근할 수 있게 만들 것이기 때문에 *을 넣어줍시다.
Gunicorn 설치
gunicorn은 단일 쓰레드로 돌아가는 Django의 활용성을 위하여 여러개의 워커들을 준비하고 요청을 처리하는 CGI(Common Gateway Interface)의 일종입니다.
single thread인 장고가 요청에 대한 처리가 끝나지 않아도 gunicorn의 다른 워커가 요청을 받습니다.
만일 너무 많은 요청이 들어와서 gunicorn이 죽을 경우 안정적으로 다시 살아나기까지 합니다. 장고가 안정적인 웹 서비스를 하도록 도와준다.
WSGI(Web Server Gateway Interface)
CGI의 일종으로 파이썬 앱이 웹 서버와 통신하기 위한 인터페이스입니다. 웹 서버에서의 요청을 해석하여 파이썬 앱쪽으로 던지는 역할을 수행합니다.
서버를 띄우면 서버에 장고앱이 올라가고 혼자서 모든 요청을 처리하는 것이 아닙니다.
먼저 Client의 requests를 웹서버인 NGINX에서 받아주고 NGINX에서 django 웹 애플리캐이션 서버로 requests를 주어 요청을 처리합니다.
그리고 다시 django -> nginx -> client로 응답을 보내주죠.
이때, 웹서버(NGINX)와 파이썬 앱(django)이 통신할 수 있게 해주는 인터페이스가 WSGI입니다.
Gunicorn은 Python WSGI로 웹서버(Nginx)로부터 서버사이드 요청을 받으면 WSGI(Gunicorn)를 통해 서버 앱(django)로 전달해주는 역할을 수행합니다.
사실 django의 runserver 역시도 같은 역할을 수행하지만 보안적으로나 성능적으로 검증되지 않았기 때문에 production 환경에서 사용하기에는 적합하지 않아 gunicorn을 사용합니다.
또한 WSGI는 멀티 쓰레드를 만들 수 있어 request 요청이 많아져도 효율적으로 처리할 수 있습니다. 따라서 production 환경에 적합합니다.
gunicorn을 설치 해줍시다.
pip install gunicorn
그런데 우리가 이때까지 쓴 써드파티 라이브러리들을 알아야 합니다. 그래서
pip freeze > requirements.txt
그럼 requirements.txt.에 우리가 사용한 써드파티 라이브러리들이 출력됩니다.
gunicorn 실행
gunicorn --build 127.0.0.1:8000 프로젝트폴더명.wsgi:applictaion
프로젝트 폴더 안에 wsgi.py 파일이 있고 거기에 application이라는 변수가 있습니다. 그 변수를 가져오라는 명령어입니다.
gunicorn은 CSS와 js image 파일을 렌더링 하지 못합니다. 그래서 실행하면 raw html이 나옵니다.
gunicorn이 CSS와 js 파일을 서빙하는 데에 워커를 낭비할 수 없기 때문에 단순한 파일 (이미지 파일 포함)서빙은 nginx가 하게 됩니다. gunicorn은 장고만 제공할 수 있는 기능들을 서빙합니다.
나름 쉽게 풀어서 쓴다고 썼는데 쓰다보니 어렵고 두서없는 것 같습니다.
글 실력이 늘어서 좋은 포스팅을 작성하는 날이 오면 좋겠습니다.
장고 0 view 2290