이번 동아리 스터디에서는 Django를 Docker와 Github Action을 이용하여 배포를 진행을 합니다.
스터디 준비를 하는 도중, 배포하는 과정에서 Django의 개발환경에 대해서 정리도 할 겸 Nginx, Gunicorn의 개념에 대해 공부하고자 합니다.
저희의 웹 서비스 구조는 다음과 같습니다.
참고로 이전 제 벨로그 글에 Web Server 그리고 이의 대표적인 Nginx, Apache에 대해서도 자세히 설명해 놓은 글이 있으니,
Web Server와 Nginx의 자세한 개념이 궁금하시다면 그 글을 찾아보면 될 것 같습니다.
오늘은 Django로 백엔드를 구축하면서 전체적인 개발 환경 및 특히, WSGI인 gunicorn에 대해서 정리하기 위해 작성한 글입니다.☺️
Nginx : Web Server
Nginx는 대표적인 웹 서버중 하나로
html과 css와 같이 정적인 컨텐츠 요청 시에는 바로 돌려주고, 동적인 컨텐츠 요청 시에는 이 요청을 WAS로 보내고(여기에서는 장고가 WAS의 역할을 한다고 보면 될 것 같습니다), WAS가 처리한 결과를 클라이언트에게 전달할 수 있습니다.
Gunicorn: WSGI Server
그동안 웹 서버, Nginx 등등은 다 공부했는데, 오늘 중점적으로 살펴볼 녀석은 바로 Gunicorn입니다.
사실 이 전까지 무슨 중간다리 역할을 해 주는 인터페이스 정도로만 알고있었지, 오늘 제대로 찾아보고 공부해보게 되었습니다.
WSGI ? CGI ?
📍 WSGI (Web Server Gateway Interface)
파이썬 애플리케이션이(파이썬 스크립트) 웹 서버와 통신하기 위한 인터페이스로, 웹 서버에서의 요청을 해석하여 파이썬 애플리케이션 쪽으로 던지는 역할을 수행합니다.
이는, 파이썬에만 종속되는 인터페이스로
WSGI는 CGI 디자인 패턴을 발전시킨 인터페이스로 보면 됩니다.📍 CGI (Common Gateway Interface)
웹 서버와 애플리케이션 사이의 동시 통역사 정도로 보면 됩니다.➡️ 즉, WSGI는 Apache나 Nginx로 들어오는 HttpRequest를(웹 서버 요청을) 파이썬이 이해할 수 있게 해주는 중간다리 역할을 해 주는 'MiddleWare' 입니다.
추가적으로 덧붙여서 설명하자면,
아까 위에서 말했듯이 Web server는 기본적으로 정적인 것만 처리를 합니다. 하지만 동적인 요청이 왔을 경우, Web server만으로는 렌더링할 수 없습니다.
백에서 작성한 애플리케이션 코드를 웹 서버가 이해하기 위해서는 Nginx와 같은 웹 서버가 내 코드(ex, 파이썬 코드)를 이해해야 하는데, 그래서 이 중간다리(MiddleWare)역할을 해 주는 WSGI가 필요한 것입니다.
이렇게 WSGI서버(->gunicorn)와 웹 애플리케이션(->django)가 WSGI의 규칙에 따라 작성되면,
웹 애플리케이션 입장에서는 내부 구현과 상관 없이 자유롭게 WSGI 서버를 골라서 사용할 수 유연성을 제공합니다.
파이썬의 대표적인 WSGI는 uWSGI, gunicorn이 있는데, gunicorn의 성능이 좀 더 좋고 가볍다고 합니다.
그래서, Django는 백엔드 애플리케이션을 위한 WSGI 서버로 gunicorn을 채택해서 사용해오고 있다고 합니다.
저도 두루뭉실하게 알고 있었는데, 쉽게 잘 설명해 주셔서 감사합니다!