본문 바로가기

WebDev

Django Deploy

Django Deploy on Apache2



django 앱을 다 만들었다면, 이제 실제 서버에 올려(deploy)보자!


내가 deploy하는 환경은 다음과 같다:

  1. AWS EC2 (Ubuntu 14.04 Server)
  2. Apache2.4 + mod_wsgi
  3. Python 3.4
  4. Django 1.9


django프로젝트 생성은 /var/www/에서 django-admin.py startproject mysite 명령을 사용해 했다



1. 프로그램 설치



sudo apt-get install apache2
sudo apt-get install python-setuptools
sudo apt-get install libapache2-mod-wsgi-py3

아파치와 아파치를 위한 wsgi 모듈을 설치한다.

참고로 Python2를 사용할 경우엔 libapache2-mod-wsgi를 설치하면 된다. 아쉬운 점으로는, 한 컴퓨터에서는 한 wsgi모듈만 설치할 수 있으므로 Python2를 사용해 개발한 웹 사이트와 Python3를 사용해 개발한 웹 사이트를 동시에 운영할 수는 없다. 한 파이썬만 선택해야 한다.




2. Apache2 설정


2.1 가상호스트 설정 입력 sudo vim /etc/apache2/sites-available/mysite.conf


수 많은 삽질을 통해 알아낸 결과: 정신사납게 이파일, 저파일 건드릴 필요 없이 가상호스트 설정 파일만 작성하면 된다...[각주:1]


어디 한번 작성해 보자


<VirtualHost *:80>

ServerName www.mysite.rog
ServerAlias mysite.org
ServerAdmin ohenwkgdj@gmail.com

DocumentRoot /var/www/mysite

Alias /robots.txt /usr/local/www/documents/robots.txt
Alias /favicon.ico /usr/local/www/documents/favicon.ico
Alias /media/ /usr/local/www/documents/media/

WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
WSGIDaemonProcess mysite.org python-path=/var/www/mysite:/usr/local/lib/python3.4/dist-packages lang='ko_KR.UTF-8' locale='ko_KR.UTF-8' processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup mysite.org

ErrorLog /var/www/logs/error.log
CustomLog /var/www/logs/custom.log combined

</VirtualHost>



위에서부터 순서대로 설명한다

  • *:80 80번 포트로 들어오는 모든 IP의 요청 허용
  • ServerName, ServerAlias 도메인 설정. 도메인을 통해 한 서버에서 다수의 도메인에 대응할 수 있다
  • ServerAdmin Internal Server Error가 발생했을 때 노출될 관리자 연락처
  • DocumentRoot 프로젝트 루트
  • Alias URL PATH static 호스팅을 위한 설정이다. 아이콘, 이미지, css, js같은 녀석들[각주:2]
  • WSGIScriptAlias URL PATH 프로젝트의 wsgi.py를 지정해주자
  • WSGIDaemonProcess SERVERALIAS options 각종 옵션들을 설정한다
    • python-path 프로젝트 루트, 그리고 django와 같은 각종 패키지들이 위치한 곳을 알려주자. 각 경로는 :를 사용해 구분한다
    • lang, locale 클라이언트가 파일을 업로드 할 때, 파일명이 한글일 경우 깨질 수 가 있다. 이 현상을 방지하는 설정이다
    • processes, threads 프로세스 수와 쓰레드 수를 지정한다. 지정 안해도 된다
    • display-name htop과 같은 명령에서 보여줄 이름. (wsgi:mysite.org) -k start와 같이 표시된다
  • WSGIProcesssGroup SERVERALIAS 프로세스 그룹 설정. 딱히 의미는 없어보인다
  • ErrorLog PATH 에러 로그가 저장될 장소를 지정한다
  • CustomLog PATH 커스텀 로그가 저장될 장소를 지정한다


참고로 위의 스크립트는 WSGI의 동작 방식 중 Daemon을 선택했다

WSGI의 동작 방식은 Embed와 Daemon이 있는데, 추천되는 방식이 Daemon이다.

Daemon 방식은 프로젝트 파일을 수정했을 때 apache2를 재시작 하지 않고도 그 수정을 반영할 수 있다는 장점[각주:3]이 있단다. deploy서버에서 수정할 일이 얼마나 있다고 수정이 끝나면 wsgi파일을 touch하는 것으로 수정을 알아차리게 하면 된다고 한다.




2.2 log 폴더 생성

sudo mkdir /var/www/logs

여러 개의 가상 호스트를 둘 것에 대비해, 가상 호스트 별로 로그 폴더를 따로 두는건 좋은 습관이다.




3. Apache2 재시작


sudo a2ensite mysite.conf
sudo service apache2 reload


모든 과정이 끝나고, 웹 브라우저를 사용해 접속하면 대망의 It worked! 페이지를 볼 수 있을  것이다... 입력된 값들은 실제 상황에 맞게 바꾸어 사용하자






추가로 이 모든 과정이 귀찮아서 파이썬 스크립트를 만들었다.

이 스크립트를 사용하면 deploy자동화가 가능하다.







  1. /etc/apache2/mod-enabled/wsgi.conf를 수정할 필요가 없다! [본문으로]
  2. AliasMatch regexURL PATH를 사용하면 정규표현식을 사용 가능하다! [본문으로]
  3. 따라서 한 서버에서 다수의 웹 서비스를 돌려야 할 경우 필수 선택이다. apache2 재시작은 실행중인 모든 웹 서비스까지 죽이는 것임을 잊지 말자 [본문으로]

'WebDev' 카테고리의 다른 글

django CSRF disable (CSRF 해제)  (0) 2016.01.20
django class-based view  (0) 2016.01.15
Django Url  (0) 2016.01.14
Django Multiple Database  (0) 2015.11.16
Django settings 값 가져오기  (0) 2015.11.15