웹프로그래밍/Django

[Django] WSGI 중 uWSGI를 통해 django 실행

ssung.k 2020. 6. 19. 05:00

django-AWS-EC2로-배포

 

[django] AWS EC2로 배포

Amazon EC2란? EC2란 Amazon Elastic Compute Cloud의 즐임말로서 AWS에서 제공하는 클라우드 컴퓨팅입니다. 이를 통해 하드웨어 구매없이 더 빠르게 애플리케이션을 개발하고 배포할 수 있습니다. Amazon EC2를

ssungkang.tistory.com

저번 포스팅에서 django를 AWS의 EC2를 이용하여 배포하고 접속을 해보았습니다.

하지만 EC2에서 django 서버를 실행시킬 때 runserver 명령을 통해 실행하였습니다.

runserver 를 사용한 실행은 개발용 서버를 실행하는데 적합하지, 실제 서비스를 운영하는데 부적합합니다.

따라서 실제 서비스에서는 웹서버를 이용을 합니다.

웹서버는 다음 포스팅에서 다룰 것이고 이번 포스팅에서는 웹서버를 사용하기 위해 WSGI 를 먼저 알아보도록 하겠습니다.

 

WSGI

WSGI는 Web Server Gateway Interface의 줄임말로 위키백과의 정의를 보면 웹서버와 웹 애플리케이션의 인터페이스를 위한 파이썬 프레임워크입니다.

다음 포스팅에서 다룰 웹서버와 우리가 만든 웹 애플리케이션 django는 상호간에 통신이 불가능하기 때문에 그 사이에서 WSGI가 인터페이스 역할을 하여 연결시켜줍니다.

사용자가 웹서버에 요청을 보내면 WSGI가 django로 넘겨주고, django에서 일련의 과정을 거친 뒤 다시 WSGI를 통해 웹서버로 전달이 됩니다.

user <-> 웹서버 <-> WSGI Server <-> Djago

 

uWSGI

WSGI도 여러가지 방법으로 구현이 가능하지만 이번 포스팅에서는 uWSGI를 사용해보도록 하겠습니다.

먼저 ssh를 통해 AWS EC2 인스턴스에 접속해줍시다.

 

유저 생성

ubuntu 환경에서 보안을 위해서 각 기능 별로 유저를 새로 생성하는게 맞지만 해당 포스팅에서는 이 부분이 중점이 아니기 때문에 생략하도록 하겠습니다.

만약 이를 하고 싶다면 유저를 생성한 후, 뒤에서 유저이름을 설정하는 곳에 생성한 유저를 설정해주면 됩니다.

sudo adduser deploy-user

저는 ubuntu라는 기본 유저로 진행을 계속 하겠습니다.

 

uWSGI 설치

uWSGI를 설치할 가상 환경을 생성하고 실행합시다.

python3 -m venv myvenv
source myvenv/bin/activate

 

그 후 uWSGI를 설치해줍니다.

pip install uwsgi

 

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 파일이란

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 파일이 생성되는 것을 확인할 수 있습니다.