Django를 활용해 사이트를 완성했으면, 실제 운영용 서버에 올려서 서비스를 시작하는 Production 과정을 거쳐야 합니다. 이 과정은 디버깅을 위해 사용했던 기능들을 끄고 여러 모듈에 분산되어 있는 Static파일들을 한 데 모아 통합 디렉토리로 만들어 주는 과정을 포함합니다.
지난번 실습까지 구현한 내용을 확인하는 데 개발용 서버 데몬인 runserver를 사용했었습니다. 이 runserver 데몬은 Shell에서 간편하게 사용할 수 있지만, 실제 운용 서버에서 사용하기에는 적합하지 않습니다. 개발과정에서만 사용하기 위해 설계되었기 때문에 최적화가 되어 있지 있고, 무엇보다도 보안과 관련된 고려가 전혀 되어 있지 않습니다.
일례로, Static파일을 찾는 과정만 보더라도 순차적으로 모든 모듈의 디렉토리를 뒤져서 찾기 때문에 극히 비효율적임을 알 수 있습니다.
Django 공식 매뉴얼에서도 다음과 같이 대문자로 강조해 가면서 runserver를 실제 운영에서 사용하지 말라고 강려ㅋ하게 강조하고 있습니다.
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that’s how it’s gonna stay. We’re in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)
따라서, Production에서는 runserver 대신 WSGI데몬의 도움을 받아서 Apache나 Nginx와 같은 웹 서버와 연동해야 합니다.
이 글에서는 웹 서버 연동 이전에 Django프로젝트에서 해 줘야 할 사전 작업들을 먼저 다루고, WSGI 연동은 다음 글에서 다루도록 하겠습니다.
설치한 패키지 목록 저장하기
다음 명령으로 VirtualEnv 샌드박스내에 설치한 의존성 패키지들의 목록을 저장한 requirements.txt파일을 작성합니다. 이렇게 의존성 패키지 목록을 작성해 두어야 다른 시스템으로 프로젝트 디렉토리를 옮긴 뒤에도 의존성 패키지 목록을 다시 쉽게 설치할 수 있습니다.
(venv)$ pip freeze > requirements.txt
참고로, requirements.txt파일로부터 의존성 패키지를 모두 설치하는 명령은 다음과 같습니다.
(venv)$ pip install -r requirements.txt
Debug모드 끄기
sitebase/settings.py파일의 DEBUG변수를 False로 바꿔 줍니다. 이렇게 함으로써 내부적으로 오류가 발생했을 때 디버깅 페이지를 표시하지 않도록 합니다.
DEBUG = False
접속 허용 호스트명 등록하기
XSS공격 등에 대비하기 위해 접속을 허용할 호스트명을 별도로 명시해 줘야 합니다. sitebase/settings.py파일의 ALLOWED_HOSTS목록에 운용 서버에서 사용할 Host이름을 등록해 줍니다. IP주소와 도메인 모두 사용할 수 있습니다.
ALLOWED_HOSTS = [ u'192.168.0.100', u'localhost', u'tuwlab.com' ]
여기에 등록되지 않은 호스트명으로 요청이 들어올 경우 400 Bad Request Error를 반환합니다.
Static파일 경로 설정 및 통합 디렉토리 만들기
역시 sitebase/settings.py파일의 STATIC_ROOT변수에 Static파일들을 모을 디렉토리 경로를 지정합니다.
STATIC_ROOT = '/var/www/static_myproject'
그리고 다음과 같이 collectstatic명령을 실행해 줍니다. 정말 복사를 할 것인지 묻는 확인 메시지가 뜰텐데, 여기에 yes를 입력하면 프로젝트에 포함된 모든 모듈의 Static파일들을 모두 일괄적으로 복사합니다.
(venv)$ ./manage.py collectstatic
이렇게 하면 통합 디렉토리가 생성되므로 Static파일들에 대한 요청은 모두 웹 서버단에서 /var/www/static_myproject 디렉토리로 연결하여 처리할 수 있게 됩니다.
이제 Django프로젝트 내에서 Production을 위한 준비는 모두 끝냈습니다. 이어지는 글에서는 각각 Nginx+uWSGI조합으로 웹 서버와 연동하는 방법에 대해 다루도록 하겠습니다.
- [Django Tutorial] 9. Production - uWSGI를 통해 Nginx 웹 서버와 연동하기 (11360) *1
- [Django Tutorial] 7. 백엔드 콘솔에 Custom Command 추가하기 (4169)
- [Django Tutorial] 6. Database 연동하기 - Model설계, Migration (30170)
- [Django Tutorial] 5. Static 파일 사용하고 관리하기 (9277)
- [Django Tutorial] 4. URL Config, Template 및 View의 동작에 대한 이해 (9219)
- [Django Tutorial] 3. 프로젝트 및 App 생성, settings.py수정(DB연동, Migration), Runserver (12322)
- [Django Tutorial] 2. 개발 환경 세팅하기 - pyenv 및 virtualenv 활용 (6614)
- [Django Tutorial] 1. 파이썬 기반 웹 프레임워크 Django에 대한 소개 (10949) *2
- VirtualEnv를 통한 Python Sandbox 개발환경 구축하기 (4437)
- pyenv를 이용하여 여러 버전의 Python 동시에 사용하기 (14711) *3