Intro

저번 1편에서는 docker-compose를 이용해 Nginx, uWSGI, Django를 연결하기에 앞서
"Hello, ~~~" 을 출력해주는 간단한 Django앱을 만들었습니다. 사실 uWSGI나 Docker 관련한 글을 보러 오신 분들은 다들 아시는 내용이겠죠. 이번엔 uWSGI, WSGI 가 각각 뭔지 알아보고 사용해볼게요.
WSGI
많~~~은 블로그에서 uWSGI와 WSGI를 설명하고도 있고, 똑~같이 설명하고도 있기때문에, 자세히는 다루지 않겠습니다.
쉽게 말해서 WSGI는 Web Server Gateway Interface라는 것인데 자바를 공부해보신분들은 아시겠죠? 인터페이스는 허상(?)일 뿐 실체가 아니잖아요. 그 WSGI 인터페이스를 구현한 구현체 중 하나가 uWSGI입니다.
참고로 WSGI는 Apache 나 Nginx 같은 정적 정보를 제공하는 웹서버를 돌리는 소프트웨어와 동적인 작업을 하는 웹 애플리케이션(ex. Django, Flask)가 소통하기 위한 인터페이스 정도로 보면 되겠습니다.
uWSGI
웹앱과 웹서버가 소통하기 위한 인터페이스인 WSGI를 구현한 것이 uWSGI인데, 헷갈리는 것이 uwsgi는 프로토콜을 의미하기도 합니다.

그러니까 웹앱과 웹서버가 소통하게 다리를 놔주는 소프트웨어가 uWSGI이고 걔네가 주고 받는 통신의 프로토콜 또한 uwsgi로 불리는 것이죠.
근데 또 헷갈리는 것은 사실상 Nginx나 Apache가 없어도 uWSGI만으로도 웹서버를 돌릴 수도 있고 Django에 uWSGI를 연결하지 않더라고 순수 Django만으로도 웹서버를 구현할 수 있으니, 아직은 굳이..? Nginx와 uWSGI를 연동해야하나...? 싶긴합니다.
개인적으로 정적 컨텐츠가 어쩌고 속도가 어쩌고는 잘 모르겠고...
Nginx는 Reverse Proxy와 Load Balancing 라는 기능들 및 클라이언트의 접속을 다양하게 제어하는 기능이 있으니 이용해야하는데 웹앱과 Nginx가 직접 연결은 못하니 uWSGI를 이용하나보다 정도로 생각 중입니다.
웹서버와 웹 애플리케이션이 어떤 방식으로 작동하는가?
Django로만 웹애플리케이션과 웹서버를 돌리는 경우
클라이언트 <--> Django
Django와 uWSGI로만 웹애플리케이션과 웹서버를 돌리는 경우
클라이언트 <--> uWSGI <--> Django
Nginx, uWSGI, Django 모두 이용해 웹애플리케이션과 웹서버를 돌리는 경우
클라이언트 <-- http protocol --> Nginx <-- uwsgi protocol --> Django
이런 식으로 통신체계가 이루어집니다.
따라해보기
uwsgi install
우선 uwsgi를 깔아줘야겠죠.
apt update && apt install -y gcc python3-dev
uwsgi는 C로 짜인 프로그램이라 c compiler가 필요한가봐요 그래서 gcc를 깔아주고
python3-dev라는 패키지도 필요한가보네요. python3.7-dev 등등 버전은 각자 다를 수도 있습니다.
성공적으로 install 하셨으면 아마 uwsgi --verision 에서 2.xx가 뜰 것 입니다.
uWSGI 테스트

웬만하면 프로젝트의 루트 경로에서 ( 사진의 경우 최상위 blog 디렉토리 )
uwsgi --http 0:8001 --module blog.wsgi 을 입력해줍시다.
--http란 uwsgi를 이용해 http 통신을 하겠다는 거고 0.0.0.0:8001 포트를 이용한다는 겁니다.
--module은 우리 django project의 wsgi 파일을 선택해주는 겁니다.
그리고 브라우저로 가서 127.0.0.1:8001로 가시면 아마 자신의 Django App이 인사를 해주겠죠? ( 안 해주면 실패한 거임 )
uWSGI는 그리 에러메시지가 눈에 띄지 않으므로 Django App이 제대로 안 떴을 경우는 주의깊게 터미널창에서 메시지를 읽어보세요
uWSGI - 인자가 아닌 .ini file로
꼭 첫줄에 [uwsgi]를 적어주세요.
여러가지 인자가 https://uwsgi-docs.readthedocs.io/en/latest/Options.html 에 적혀있지만, 컨셉이 Super Simple하게 한 번 구현이나 해보자이기 때문에 가장 필수인 옵션만 줘보겠습니다.
방금 전에 Commad line으로 줬던 인자만 쓰면 돼요.
# tutorial.ini
[uwsgi]
chdir=/root/django/blog
module=blog.wsgi
#socket=0.0.0.0:8001
http= 0.0.0.0:8001
주석처리한 부분은 나중에 다음편에서 이용할 부분입니다.
chdir은 아까 말씀드린대로 나의 Django project의 루트경로를 입력해주시면 되고.
만약 settings.py 와 같은 곳에 위치한 wsgi.py의 위치가 /root/django/blog/blog/wsgi.py이면
chdir과 module을 저런 식으로 입력해주시면 됩니다.
그리고 아직 Nginx를 앞에 안 깔았으니 uWSGI가 직접 http protocol을 받기 때문에 어떤 아이피의 어떤 포트로 http 요청을 받을 지 적어줍시다.
위에서 말씀드렸듯이, Nginx가 uWSGI앞에 깔리면 Nginx가 직접 http protocol을, uWSGI는 그 뒤에서 uwsgi protocol을 받습니다
올바르게 작성하셨다면 .ini file이 있는 위치에서 uwsgi --ini tutorial.ini 라고 적어주시고
다시한 번 브라우저에서 127.0.0.1:8001에 가시면 다시 Django App 이 여러분께 인사하는 모습을 보실 수 있습니다!
( 보셔야해요 ㅜㅅㅜ )
마치며
간단하게 Django와 uWSGI를 연결하는 법을 알아보았습니다.
놓치기 쉬운 실수가 .ini file에서 [uwsgi]를 적지 않는 것, Nginx를 앞에 두지 않고 socket protocol로 적거나 Nginx를 앞에 두고서도 http protocol을 두는 경우 등 입니다.
'Python > Frameworks.Libraries' 카테고리의 다른 글
| Django, uWSGI, NGINX 헷갈리는 거 정리, 꿀팁, Cheating Sheets (0) | 2019.09.22 |
|---|---|
| [Django] Django에서 static 과 media 이용하기. DEBUG=False일 때 static (0) | 2019.09.22 |
| Django App Templates Directory. 장고 앱 템플릿 디렉토리 구조에 대해 (0) | 2019.09.02 |
| Django 테이블 삭제하는 방법. django.db.utils.OperationalError: no such table 오류 해결 방법 (0) | 2019.09.01 |
| docker-compose를 통해 Nginx, Django 연동하기 1 - 간단한 Django app 만들기 (0) | 2019.07.22 |