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 |