AWS-장고로 백엔드 만들기(2) - uWSGI 연결하기

jiiiii·2021년 9월 6일
1

졸업 작품

목록 보기
2/3
post-thumbnail

인스턴스를 열었으니 이제 장고와 웹 서버를 연결할 차례! 이 부분은 https://nerogarret.tistory.com/47 네로님의 블로그에서 굉장히 많은 도움을 얻었습니다. 감사합니다.

WSGI란?

WSGI는 Web Server Gateway Interface의 줄임말로, 웹 서버 소프트웨어와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스다. 장고는 웹 서버와 직접적으로 통신하는 것이 불가능해 파이썬 패키지인 uWSGI를 설치해 둘을 중간에서 이어줘야 한다.

runserver부터 해보자

우선 가상환경을 이미 설치해서 사용하고 있지 않다면, python3-venv를 설치하고 홈 디렉토리에 가상 환경을 만들어 준 뒤 가상환경을 실행시켜 준다.

$ sudo apt-get install python3-venv
$ cd ~
$ python3 -m venv myvenv
$ source myvenv/bin/activate

가상 환경에 장고 프로젝트에 필요한 패키지를 다 설치한다. 장고 프로젝트의 manage.py가 있는 디렉토리에서 필요한 모든 패키지를

$ pip3 freeze >> requirements.py

이렇게 requirements.py 파일에 저장한 뒤

$ pip3 install -r requirements.py

를 통해 설치하는 방법이 정석이지만 나는 이 방법이 계속 오류가 나서 그냥 필요한 걸 수동으로 다 설치했다. 설치가 완료된 후 원하는 포트 번호 하나(e.g. 8080)를 정해 Lightsail에서 열어주어야 한다.

우선 인스턴스의 Manage로 들어간다.

들어와서 Networking 탭을 누르면 이런 화면이 나타난다.

여기서 port 8080을 추가한다.

다시 돌아와 manage.py가 있는 디렉토리에서 runserver을 해준다.

$ python3 manage.py runserver 8080

그 후 public IP에 :8080을 붙여 브라우저에서 접속하면 장고 프로젝트의 첫 화면이 뜰 것이다. 혹시 Disallowed Host 에러가 뜬다면 settings.py의 ALLOWED_HOTS에 해당 주소를 추가하거나 아예 '*' 를 추가해 모든 호스트를 다 허용할 수도 있다.

ALLOWED_HOSTS = ['*']

uWSGI 서버 연결하기

패키지 설치

WSGI를 사용하기 위해서는 uWSGI라는 python 패키지를 설치해야 한다. 아까 만들어둔 가상 환경에 uWSGI를 설치한다.

$ source myvenv/bin/activate
$ pip install uwsgi

혹시 에러가 생기는 경우에는 wheel을 설치해준 후 uwsgi를 재설치한다.

$ pip install wheel

uWSGI를 이용해 장고 프로젝트 연결하기

uwsgi --http :[포트번호] --home [venv경로] --chdir [장고프로젝트경로] -w [wsgi모듈폴더].wsgi
  • 포트 번호: 8080
  • 가상환경 경로: ~/myvenv이지만 이왕이면 절대경로를 적어야 오류를 방지할 수 있다. /home/ubuntu/myvenv
  • 장고 프로젝트 경로: 이건 개개인마다 다르지만 나의 경우 /srv/django_project 이었음
  • wsgi 모듈이 있는 폴더 이름: 장고 프로젝트 폴더(settings.py가 있는 곳) 내에 wsgi.py 파일이 생겨있을 것. 따라서 project_name.wsgi

결과적으로는

uwsgi --http :8080 --home /home/ubuntu/myvenv --chdir /srv/django_project -w project_name.wsgi

를 입력하면 서버가 켜진다. 다시 IP주소:8080을 브라우저에 입력해 접속을 하면 장고 프로젝트의 첫 화면이 뜨게 된다.

ini 파일 만들어서 uWSGI 실행시키기

하지만 매번 저 복잡한 명령어를 사용해 서버를 여는 건 너무 귀찮다. 그래서 파일들로 옵션을 저장해 wsgi가 알아서 서버를 열 수 있게 한다.

그런데 이걸 하기 전에 보안상 배포용으로 새로 계정을 하나 만들어 두는 게 좋으니 deploy라는 계정을 새로 만든다. 비밀번호는 알아서 치고, 나머지 내용은 입력하고 싶으면 하고 안 해도 무방하다.

$ sudo adduser deploy

이제 옵션을 저장할 차례. 우선 manage.py가 있는 디렉토리로 들어와서 .config 디렉토리를 새로 만들고 그 안에 uwsgi 디렉토리를 또 만든다.

$ mkdir .config
$ cd .config
$ mkdir uwsgi

그 안에 project_name.ini 파일을 만들고 위에 작성한 복잡한 명령어의 내용을 담아 파일을 작성한다.

[uwsgi]
chdir = /srv/django_project/
module = project_name.wsgi:application
home = /home/ubuntu/myvenv/

uid = deploy
gid = deploy

http = :8080

enable-threads = true
master = true
vacuum = true
pidfile = /tmp/project_name.pid
logto = /var/log/uwsgi/project_name/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
  • chdir, home은 위에 작성한 그대로 쓰면 된다.
  • module은 -w 옵션 + :application
  • uid, gid는 userid, groupid 이므로 아까 새로 만든 계정 이름인 deploy
  • http는 사용할 포트 번호
  • pid는 Process Identifier로 프로세스 식별자라고 한다. 유닉스 시스템에서 각 프로세스/서비스를 식별하기 위해 각각의 프로레스/서비스에 할당하는 번호다. 이걸 저장할 경로를 지정한다.
  • logto는 로그를 저장할 경로를 지정한다.

로그를 작성한 경로가 아직 존재하지 않으니 만들어 주고, 배포용 계정이 그 폴더의 소유주여야 로그를 작성할 수 있으니 소유주를 바꿔준다.

$ sudo mkdir -p /var/log/uwsgi/project_name/
$ sudo chown -R deploy:deploy /var/log/uwsgi/project_name/

project_name.ini의 옵션을 이용해 uWSGI 서버를 다시 킨다. 관리자 권한으로 실행하기 위해 가상환경 내에 설치된 uWSGI를 직접 실행시킨다. 이건 가상환경 디렉토리의 bin 안에 있음.

$ sudo /home/ubuntu/myvenv/bin/uwsgi -i /srv/django_project/.config/uwsgi/project_name.ini

이 명령어를 실행시키면 서버가 켜지고 위와 동일하게 IP주소로 접속을 하면 정상적으로 작동한다.

0개의 댓글