Django를 AWS의 EC2를 이용하여 배포하고 접속을 해보았습니다. 하지만 EC2에서 Django 서버를 실행시킬 때 runserver 명령을 통해 실행하였습니다. runserver를 사용한 실행은 개발용 서버를 실행하는데 적합하지 실제 서비스를 운영하는데 부적합합니다.
따라서 실제 서비스에서는 웹 서버를 이용을 합니다. 웹 서버는 다음 포스팅에서 다룰 것이고 이번 포스팅에서는 웹 서버를 사용하기 위해 WSGI를 먼저 알아보도록 하겠습니다.
WSGI
WSGI는 Web Server Gateway Interface의 줄임말로 위키백과의 정의를 보면 웹 서버와 웹 애플리케이션의 인터페이스를 위한 python 프레임워크입니다.
다음 포스팅에서 다룰 웹 서버와 우리가 만든 웹 애플리케이션 Django는 상호간에 통신이 불가능하기 때문에 그 사이에서 WSGI가 인터페이스 역할을 하여 연결시켜줍니다.
사용자가 웹 서버에 요청을 보내면 WSGI가 Django로 넘겨주고 Django에서 일련의 과정을 거친 뒤 다시 WSGI를 통해 웹 서버로 전달이 됩니다.
user <-> 웹 서버 <-> WSGI Server <-> Django
uWSGI
WSGI도 여러가지 방법으로 구현이 가능하지만 이번에는 uWSGI를 사용해보도록 하겠습니다.
유저 생성
먼저 ssh를 통해 AWS EC2 인스턴스에 접속합니다.
Ubuntu 환경에서 보안을 위해서 각 기능별로 유저를 새로 생성하는게 맞지만 이 부분이 중점이 아니기 때문에 생략하도록 하겠습니다. 만약, 이를 하고 싶다면 유저를 생성한 후 뒤에서 유저 이름을 설정하는 곳에 생성한 유저를 설정해주면 됩니다.
저는 Ubuntu라는 기본 유저로 진행을 계속 하겠습니다.
sudo adduser deploy-user
uWSGI 설치
uWSGI를 설치할 가상 환경을 생성하고 실행합시다.
python3 -m venv myvenv source myvenv/bin/activate
그 후 uWSGI를 설치해줍니다.
pip install uwsgi
uWSGI 실행
실행을 하기 전에 몇 가지 옵션들에 대해서 알아봅시다.
http
: 포트번호를 지정해줍니다.
home
: 가상환경의 경로를 지정해줍니다.
chdir
: Django project의manage.py
가 존재하는 경로를 지정해줍니다.
w
: WSGI 파일을 지정해줍니다.
다음의 명령어로 uWSGI를 실행할 수 있습니다.
uwsgi \ --http :8000 \ --home /home/ubuntu/myvenv \ --chdir /home/ubuntu/BackEnd/Django/project \ -w config.wsgi.deploy
현재 상황은 WSGI를 분리하여 그 안에 deploy라는 파일을 추가적으로 생성하였습니다. 만약 별도의 처리가 없었다면 -w config.wsgi 까지만 기재해주시면 됩니다.
이제 public DNS의 8000번 포트로 접속하면 성공적으로 접속이 되는 것을 확인할 수 있습니다.
ini 파일로 uWSGI 실행
uWSGI를 실행하기 위해서 옵션이 많이 필요합니다. 또한 해당 옵션들을 절대 경로로 적어주다보니 명령어 하나의 양이 적지 않습니다.
이를 위해 ini 파일에 해당 설정들을 저장하여 실행할 수 있습니다.
ini(initialization file) 파일이란, 응용 프로그램이 실행될 때 필요한 초기화 정보를 담는 파일입니다.
로컬에서 다음과 같은 경로에
wsgi.ini
을 만들어주었습니다.project/config/wsgi/wsgi.ini
wsgi.ini
에는 다음과 같이 기재해줍시다.[uwsgi]chdir = /home/ubuntu/BackEnd/Django/project module = config.wsgi.deploy:application home = /home/ubuntu/myvenv uid = ubuntu gid = ubuntu http = :8000 enable-threads = true master = true vacuum = true pidfile = /tmp/mysite.pid logto = /var/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log log-reopen = true
chdir
: Django project의manage.py
가 존재하는 경로를 지정해줍니다.
module
: WSGI 파일을 지정해줍니다.
home
: 가상환경의 경로를 지정해줍니다.
uid
,gid
: uWSGI를 실행할 사용자 및 사용자그룹을 지정해줍니다.
http
: HTTP 프로토콜을 통해서 요청을 받으며 포트 번호를 정해줍니다.
enable-threads
: 스레드 사용 여부를 결정합니다.
master
: 마스터 프로세스 사용 여부를 결정합니다.
vacuum
: 실행 시 자동 생성되는 파일들을 삭제해줍니다.
pidfile
: 실행되는 프로세스의 id 값을 담고 있는 파일, pidfile의 경로를 지정해줍니다.
logto
: 로그파일을 작성할 위치를 설정합니다.
log-reopen
: 재시작할 시 로그를 다시 열어줍니다.
uWSGI를 실행하기 전에 로그를 저장할 경로를 미리 만들어줘야 합니다.
sudo mkdir -p /var/log/uwsgi
생성한 경로에 대한 권한을 부여해주겠습니다. -R을 통해서 해당 경로 하위의 모든 파일에 적용해줍니다.
sudo chown -R ubuntu:ubuntu /var/log/uwsgi/
이제 ini 파일로 uWSGI를 실행해봅시다.
sudo /home/ubuntu/myvenv/bin/uwsgi -i /home/ubuntu/BackEnd/Django/project/config/wsgi/wsgi.ini
접속이 잘 되는 것을 확인할 수 있고
/var/log/uwsgi/
해당 경로에 log 파일이 생성되는 것을 확인할 수 있습니다. uWSGI를 사용하여 Django를 웹 서버와 연결시킬 준비를 마쳤습니다.