Django Deploy on Apache2
django 앱을 다 만들었다면, 이제 실제 서버에 올려(deploy)보자!
내가 deploy하는 환경은 다음과 같다:
- AWS EC2 (Ubuntu 14.04 Server)
- Apache2.4 + mod_wsgi
- Python 3.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를 재시작 하지 않고도 그 수정을 반영할 수 있다는 장점이 있단다. 3deploy서버에서 수정할 일이 얼마나 있다고 수정이 끝나면 wsgi파일을 touch하는 것으로 수정을 알아차리게 하면 된다고 한다.
2.2 log 폴더 생성
sudo mkdir /var/www/logs
여러 개의 가상 호스트를 둘 것에 대비해, 가상 호스트 별로 로그 폴더를 따로 두는건 좋은 습관이다.
3. Apache2 재시작
sudo a2ensite mysite.conf
sudo service apache2 reload
모든 과정이 끝나고, 웹 브라우저를 사용해 접속하면 대망의 It worked! 페이지를 볼 수 있을 것이다... 입력된 값들은 실제 상황에 맞게 바꾸어 사용하자
추가로 이 모든 과정이 귀찮아서 파이썬 스크립트를 만들었다.
이 스크립트를 사용하면 deploy자동화가 가능하다.
'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 |