인스턴스를 열었으니 이제 장고와 웹 서버를 연결할 차례! 이 부분은 https://nerogarret.tistory.com/47 네로님의 블로그에서 굉장히 많은 도움을 얻었습니다. 감사합니다.
WSGI는 Web Server Gateway Interface의 줄임말로, 웹 서버 소프트웨어와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스다. 장고는 웹 서버와 직접적으로 통신하는 것이 불가능해 파이썬 패키지인 uWSGI를 설치해 둘을 중간에서 이어줘야 한다.
우선 가상환경을 이미 설치해서 사용하고 있지 않다면, 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 = ['*']
WSGI를 사용하기 위해서는 uWSGI라는 python 패키지를 설치해야 한다. 아까 만들어둔 가상 환경에 uWSGI를 설치한다.
$ source myvenv/bin/activate
$ pip install uwsgi
혹시 에러가 생기는 경우에는 wheel을 설치해준 후 uwsgi를 재설치한다.
$ pip install wheel
uwsgi --http :[포트번호] --home [venv경로] --chdir [장고프로젝트경로] -w [wsgi모듈폴더].wsgi
결과적으로는
uwsgi --http :8080 --home /home/ubuntu/myvenv --chdir /srv/django_project -w project_name.wsgi
를 입력하면 서버가 켜진다. 다시 IP주소:8080을 브라우저에 입력해 접속을 하면 장고 프로젝트의 첫 화면이 뜨게 된다.
하지만 매번 저 복잡한 명령어를 사용해 서버를 여는 건 너무 귀찮다. 그래서 파일들로 옵션을 저장해 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
로그를 작성한 경로가 아직 존재하지 않으니 만들어 주고, 배포용 계정이 그 폴더의 소유주여야 로그를 작성할 수 있으니 소유주를 바꿔준다.
$ 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주소로 접속을 하면 정상적으로 작동한다.