ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개념 정리] Django, Nginx 그리고 Gunicorn의 관계
    django 2022. 2. 13. 18:23

     

      처음 서버를 배포했을 때, Nginx와 Gunicorn을 시키는 대로 설치해서 연동해주었는데, 실제로 이들 각각이 무슨 역할을 하는지 잘 몰랐다. 이번 포스팅에서는 서버 배포 시 Nginx와 Gunicorn의 역할에 대해 알아보고자 한다.


    먼저 설명에 앞서 다음 그림을 살펴보자.

    Client - Web Server - WAS - DB 관계

    # Web Server vs Web Application Server

     : 클라이언트가 요청을 보내면 먼저 Web Server가 이를 받는다. 웹서버는 클라이언트의 요청에 대해 html, css, 이미지 등 정적 파일 (static file)을 응답한다. WAS는 Web Application Server의 줄임말로, 클라이언트의 요청에 의해 실제 DataBase에 값들이 수정/생성되는 동적인 처리를 전문으로 한다. 웹서버가 정적인 처리를 대신해줌으로써 WAS는 동적인 처리에만 집중하면 되므로 부담이 줄어든다.

     

    # Nginx

     : 위에서 설명한 Web Server의 대표적인 예가 바로 Nginx와 Apache이다. 특히 Nginx는 네이버, 카카오, 넷플릭스 등이 사용할 정도로 인기가 많은데 그 이유는 다음과 같다.

     

      1. 속도가 빠르다

      2. 리버스 프록시로 사용 가능하다.

      3. 비동기 처리가 가능하다.

     

    2번에 대해 자세히 설명하자면, 리버스 프록시 (Reverse Proxy)란 백엔드와 인터넷 사이에 있는 서버를 말한다. (Forward Proxy는 클라이언트와 인터넷 사이에 있는 서버) Nginx는 클라이언트 요청을 여러 WAS에 분산시키는 로드밸런싱, WAS에 요청하지 않아도 클라이언트에게 바로 응답할 수 있는 캐싱 기능들을 수행할 수 있다.  


    # WSGI

     : Gunicorn은 WSGI의 일종이다. WSGI란 Web Server Gateway Interface의 약자로, CGI의 일종이다. CGI는 Common Gateway Interface의 약자로 정적인 웹에서 동적인 웹으로 발전함에 따라 각기 다른 프로그래밍 언어가 사용되어 "공통적인 형태"로 주고받기 위해 만든 규약(specification)이다. 쉽게 말해 정적인 처리를 하는 Web Server와 동적인 처리를 하는 Web Application Server 간의 통역가 역할을 한다. WSGI는 CGI 중에서 파이썬 스크립트가 웹서버와 효율적으로 통신하기 위해 만들어진 인터페이스이다. WSGI의 예시로 Gunicorn과 uWSGI가 있으며 Nginx로 들어오는 HttpRequest를 파이썬이 이해할 수 있게 동시통역하는 존재들이다.

     

    *CGI는 요청이 들어올 때마다 파이썬 스크립트를 처음부터 실행하게 되어 서버가 느려지고 비효율적인데 이를 해결한 것이 WSGI로 스크립트 전체를 실행하는 것이 아니라 필요한 로직 하나만 실행한 후 결과를 응답한다고 한다.


    # Django + Nginx + Gunicorn

    Django, Gunicorn, Nginx의 관계는 위 그림과 같으며, Nginx는 Web Server, Gunicorn은 WSGI Server, Django는 Web Application Framework이다. 장고만으로 python manage.py runserver 명령어를 통해 서버를 가동할 수 있지만, 이는 보안이나 성능 문제로 개발 목적에서만 사용되고, 배포 시에는 Gunicorn을 사용해주어야 한다. 추가적으로 Gunicorn을 사용하면 이전 포스트에서도 말했듯이 Single-Thread인 장고가 Multi-Thread로 클라이언트의 요청들을 효율적으로 처리할 수 있다.

     

    이들의 관계를 요약하자면,

    클라이언트로부터 HTTP Request가 오면 정적인 처리는 Web Server인 Nginx에서 맡고, 동적인 처리가 필요한 부분은 WSGI인 Gunicorn에 HTTP Request를 전달한다. Gunicorn은 이를 WSGI Request로 변환하여 Django로 보내면 Django에서 DataBase와 연동하여 이를 처리하고, 그 결과를 WSGI Response로 Gunicorn에 보낸다. Gunicorn은 이를 다시 HTTP Response로 변환하여 Nginx에 보내고 Nginx는 이를 Client에게 전달한다.


    참조

    https://moondol-ai.tistory.com/467

     

    Nginx, Gunicorn이란 무엇인가? feat. Django

    본 글에서는 Django를 실제 서버로 배포하면서 필요했던 Nginx, Gunicorn의 개념에 대해 알아보고자 합니다. 참고로 저는 Django로 백엔드를 구축했다 보니 아래에서 소개되는 웹서비스 구조는 Django를

    moondol-ai.tistory.com

     

Designed by Tistory.