본문 바로가기

Python/Frameworks.Libraries

docker-compose를 통해 Nginx, Django 연동하기 2 - Django App과 uWSGI 연동하기

Intro

저번 1편에서는 docker-compose를 이용해 Nginx, uWSGI, Django를 연결하기에 앞서

"Hello, ~~~" 을 출력해주는 간단한 Django앱을 만들었습니다. 사실 uWSGIDocker 관련한 글을 보러 오신 분들은 다들 아시는 내용이겠죠. 이번엔 uWSGI, WSGI 가 각각 뭔지 알아보고 사용해볼게요.

WSGI

많~~~은 블로그에서 uWSGIWSGI를 설명하고도 있고, 똑~같이 설명하고도 있기때문에, 자세히는 다루지 않겠습니다.

쉽게 말해서 WSGI는 Web Server Gateway Interface라는 것인데 자바를 공부해보신분들은 아시겠죠? 인터페이스는 허상(?)일 뿐 실체가 아니잖아요. 그 WSGI 인터페이스를 구현한 구현체 중 하나가 uWSGI입니다.

참고로 WSGIApacheNginx 같은 정적 정보를 제공하는 웹서버를 돌리는 소프트웨어와 동적인 작업을 하는 웹 애플리케이션(ex. Django, Flask)가 소통하기 위한 인터페이스 정도로 보면 되겠습니다.

uWSGI

웹앱과 웹서버가 소통하기 위한 인터페이스WSGI구현한 것이 uWSGI인데, 헷갈리는 것이 uwsgi프로토콜을 의미하기도 합니다.

uWSGI Official Site에서도 Wrong Naming 이라네요....

그러니까 웹앱웹서버가 소통하게 다리를 놔주는 소프트웨어가 uWSGI이고 걔네가 주고 받는 통신의 프로토콜 또한 uwsgi로 불리는 것이죠.

근데 또 헷갈리는 것은 사실상 NginxApache가 없어도 uWSGI만으로도 웹서버를 돌릴 수도 있고 DjangouWSGI를 연결하지 않더라고 순수 Django만으로도 웹서버를 구현할 수 있으니, 아직은 굳이..? Nginx와 uWSGI를 연동해야하나...? 싶긴합니다.

개인적으로 정적 컨텐츠가 어쩌고 속도가 어쩌고는 잘 모르겠고...

NginxReverse ProxyLoad 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이면

chdirmodule을 저런 식으로 입력해주시면 됩니다.

그리고 아직 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을 두는 경우 등 입니다.