안녕하세요?
지난 번 포스트까지 해서
이제 그럴싸한 블로그 형태의 사이트를 만들었습니다.
그런데 지금까지는 계속 서버를 껐다가 켜야만하는 테스트하는 정도의 수준이지,
24시 열려있는 실제 서비스 가능한 수준이 아닌 것 같습니다.
그러므로 실제 서비스 가능한 서버처럼 사용 가능하도록 작업을 해주어야 합니다.
지금까지는 'runserver' 명령어를 이용하여 서버를 올렸는데,
django 공식 문서에 따르면 아래와 같이
django 는 프레임워크를 지원하는 것이지, 웹서버를 제공하지 않는다.
'운영 환경'에서의 사용은 우리 영역이 아니다! 라는 말이 있습니다.
DO NOT USE THIS SERVER IN A PRODUCTION SETTING.
It has not gone through security audits or performance tests.
(And that’s how it’s gonna stay. We’re in the business of making Web frameworks, not Web servers,
so improving this server to be able to handle a production environment is outside the scope of Django.)
그래서 저희는 운영환경에서 서비스를 해야하기 때문에
따로 웹서버(nginx) 와 웹서버<>django 사이를 연결시키는 게이트웨이(uWSGI)를 설정해주는 작업을 할 것입니다.
먼저 이번 포스트에서는 uWSGI 에 대해 작업해보겠습니다.
uWSGI 란?
기본적으로 웹서버는 http형식의 요청을 받아서 처리 후, 응답을 해주는 기능을 합니다.(웹서버의 개념을 모르신다면 Web Server와 WAS 의 차이는? (feat. Django의 WAS는?) 참조)
이러한 처리는 nginx와 같은 웹서버 통해 요청을 받고, django 까지 도달하여 처리가 이뤄집니다.
그런데 Django는 python으로 이루어져있기 때문에 HTTP 요청을 이해할 수 없어서,
uWSGI 같은 '파이썬 어플리케이션이 웹서버와 통신하기 위한' 소프트웨어가 필요합니다
다시 말해 정적인 웹서버(Nginx)와 프레임워크(Django) 사이의 통신을 도와주는 게이트웨이 역할을 합니다.
uWSGI 사용법
먼저, 가상환경을 켜고 uWSGI 를 설치합니다.
> source ~/myvenv/bin/activate
> pip3 install uwsgi
설치가 완료되었으면, 아래와 같은 명령어로 uWSGI와 Django 프로젝트를 연결시켜줍니다.
uwsgi --http :[포트번호] --home [가상환경 경로] --chdir [장고프로젝트폴더 경로] -w [wsgi 모듈이 있는 폴더]/wsgi.py
- 포트번호: 8000
- 가상환경 경로: uwsgi를 설치한 myvenv의 경로입니다. 저는 ~/app/django/Test/myvenv 가 가상환경 경로입니다.
- 장고 프로젝트 폴더 경로: 저는 ~/app/django/Test/TestProject 입니다.
- wsgi 모듈이 있는 폴더: 프로젝트 폴더에 안에 wsgi.py가 있을겁니다. ~/app/django/Test/TestProject/TestProject/
이를 조합한 명령어는 아래와 같고, 이를 입력하면
uwsgi --http :8000 --home ~/app/django/Test/myvenv --chdir ~/app/django/Test/TestProject --wsgi-file ~/app/django/Test/TestProject/TestProject/wsgi.py
아래와 같이 뭐가 주르륵 뜨면서 서버가 올라갑니다.
*** Starting uWSGI 2.0.21 (64bit) on [Thu Jan 12 15:03:13 2023] ***
compiled with version: 7.5.0 on 12 January 2023 14:55:34
os: Linux-5.4.0-1093-aws #102~18.04.2-Ubuntu SMP Wed Dec 7 00:31:59 UTC 2022
nodename: ip-172-31-63-160
machine: x86_64
clock source: unix
detected number of CPU cores: 2
저희 사이트 주소로 들어가보면 아래와 같이 정상적으로 접속이 되는 것을 볼 수 있습니다.
config 파일을 만들어서 uWSGI 연결하기
위에서 runserver 명령어 없이 서버를 올렸는데,
명령어가 너무 길다보니 외우기 힘들겠죠?
이를 config 파일을 만들어서 세팅하고, 보다 편리하게 서버를 올릴 수 있도록 하겠습니다.
먼저, manage.py가 있는 폴더에서 .config 폴더를 만들고 그 안에 uwsgi 폴더를 만듭니다.
그리고 해당 경로에 [본인의 프로젝트명].ini 파일을 만들고 해당 파일을 아래와 같이 작성합니다.
#Test/TestProject/.config/uwsgi/Test.ini
[uwsgi]
chdir = /home/ubuntu/app/django/Test/TestProject
module = TestProject.wsgi:application
home = /home/ubuntu/app/django/Test/myvenv
uid = ubuntu
gid = ubuntu
http = :8000
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/Test.pid
logto = /var/log/uwsgi/Test/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
- chdir: 장고 프로젝트 폴더의 경로. 아까 uwsgi 명령어를 칠 때 chdir 다음에 왔던 경로와 동일합니다.
- modeule: 아까 입력했던 -w 옵션 뒤의 값과 같으나 뒤에 :application을 붙여주세요.
- home: 아까 입력했던 가상환경의 경로와 동일합니다.
- uid: uwsgi를 사용할 계정입니다.
- gid: uwsgi를 사용할 그룹입니다.
- http: 사용할 포트 번호입니다.
- logto: uwsgi 서버의 로그를 저장할 폴더입니다.
로그 파일이 쌓이는 폴더가 현재 없기 때문에 만들어줍니다.
sudo mkdir -p /var/log/uwsgi/Test
아래 명령어로 서버를 다시 켜봅니다.
sudo ~/app/django/Test/myvenv/bin/uwsgi -i ~/app/django/Test/TestProject/.config/uwsgi/[프로젝트명].ini
그러면 아래와 같이 뜨고, 서버가 올라갑니다.
[uWSGI] getting INI configuration from /home/ubuntu/app/django ...
다음 포스트에서는 웹서버인 nginx 를 연결시켜보도록 하겠습니다!
Reference
https://jakpentest.tistory.com/208
https://kodorricoding.tistory.com/23
https://nerogarret.tistory.com/47