Tech & Programming/파이썬

WSGI를 이용한 Django(장고) 와 아파치 웹서버 연동

소스코드 요리사 2018. 5. 14. 15:20


몇 주전 '기분좋은인사' 어플을 기능 업데이트를 위해 django를 이용하여 REST API 를 구축했습니다. 

Python 에서 제공하는 runserver 는 운영하기에는 모자란 부분이 많기 때문에 이제 운영을 하기 위해서 아파치 웹서버에 WSGI를 이용해 연동을 시켜려고 합니다.


이번 글에서는 WSGI에 대해 간략하게 알아보고, mod-wsgi를 이용해 django와 연동하는 방법에 대해 적어보겠습니다.




1. WSGI란?

WSGI(Web Server Gateway Interface)는 웹서버와 파이썬을 사용한 웹 어플리케이션 개발환경 간의 인터페이스에 대한 규칙입니다. 

파이썬으로 선택할 수 있는 웹 프레임워크에서 사용할 수 있는 기존 웹서버는 CGI, FastCGI, mod_python, 또는 커스텀으로 만들어진 API 등으로 상당히 제한되어 있었고,

또 반대로 웹서버를 선택하는 것이 파이썬 웹개발환경을 제한하기도 하였습니다. 

이를 위해 표준으로 나온 것이 WSGI이다. 즉, 파이썬으로 다양한 웹서버를 사용할 수 있도록 한 프로토콜로 정의하면 될 것 같습니다.


저는 아파치 웹서버에서 개발한 Django REST API 를 구동하기 위해서, mod-wsgi를 사용하기로 했습니다.

mod_wsgi란 Django와 같은 WSGI 인터페이스를 지원하는 파이썬 어플리케이션을 아파치 웹서버에서 동작할 수 있도록 해주는 아파치 모듈입니다.



2. 작업 환경 소개

아마존 EC2 인스턴스 : Ubuntu 16.04.4 LTS

Django 버전 : 2.0.3

Python 버전 : python 3.5.2


3. 아파치 설치

콘솔에 아래와 같이 입력합니다. 참고로 AWS EC2 를 이용하면 기본적으로 설치되어 있습니다.


# sudo apt-get install apache2


4. 아차피 mod-wsgi 설치

콘솔에 아래와 같이 입력합니다. 참고로 AWS EC2 를 이용하면 mod-wsgi도 기본적으로 설치되어 있습니다.


파이썬 3 에서는 아래와 같이 libapache2-mod-wsgi 패키지가 아니라 libapache2-mod-wsgi-py3 로 설치해야 합니다. 

버전이 안 맞으면 wsgi 가 아예 작동이 안 되니 반드시 확인 후 올바른 버전으로 설치해야 합니다.


# apt-get install libapache2-mod-wsgi-py3


5. wsgi.py 파일 수정

파이썬 프로젝트 폴더 아래에 보면 wsgi.py 파일이 있는 것을 볼 수 있습니다.

텍스트 편집기를 이용해서 아래와 같이 편집합니다.

import os, sys
from django.core.wsgi import get_wsgi_application

path = os.path.abspath(__file__+'/../..')
if path not in sys.path:
    sys.path.append(path)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "new_letter.settings")
application = get_wsgi_application()




저는 한 IP에 다른 포트로 여러 서비스를 진행 중이기 때문에 VirtualHost 를 이용해서 아래와 같이 포트를 열고 sites-available 의 default.conf 에 추가하였습니다. 아파치2와 django 연동으로 구글링해보시면 다른 방법으로 추가하는 자료도 찾을 수 있습니다.





6. 8000 포트 열기

아래와 같이 입력하여 ports.conf 를 열어 Listen 8000 을 추가합니다.


# cd /etc/apach2

# sudo vim ports.conf




7. 000-default.conf 수정

아래와 같이 입력하여 000-default.conf 를 수정합니다.


# cd /etc/apach2/sites-available/

# sudo vim 000-default.conf 



mod_wsgi 에서는 데몬 모드를 사용할 것을 권장하고 있습니다. 

WSGIDaemonProcess 이후 Django 프로젝트 이름을 써주고 python-path에는 처음에 Django 프로젝트 경로를 써줍니다. 

그 후 : 표시를 한 후 python library 경로(패키지들을 찾을 수 있는 경로)를 써줍니다.

WSGIDaemonProcess new_letter python-path=/home/ubuntu/letter_pjt/letter/new_letter/:/home/ubuntu/letter_pjt/venv/lib/python3.5/site-packages


그런데, Python 3.5 이후부터는 위 <VirtualHost> 태그 내 소스처럼 python-path 이 후 바로 python library 경로를 적어야 합니다.

그렇지 않으면 django 모듈을 찾을 수 없다는 에러가 발생합니다.

참고로, 저는 virtualenv 환경이기 때문에 virtualenv의 site-packages 경로를 적어주었습니다.


WSGIScriptAlias에서는 wsgi.py 경로를 써줍니다.

그리고, <Directory> 태그로 각 경로의 접속권한을 설정해줍니다.


ErrorLog,CustomLog 키워드는 아파치 에러 로그가 생성될 경로를 적어주시면된니다.


8. wsgi.py 파일의 권한 변경

아래와 같이 chmod를 이용하여 모든 사람에게 허용가능으로 권한을 변경합니다.


# sudo chmod 655 wsgi.py


9. Apache 재시작

마지막으로 아파치를 재시작합니다.


# sudo  apachectl -k restart