본문 바로가기

Programming/Web

[Web Server] Django와 Web Server

Django 를 통해 간단한 pytorch 자연어 처리 모델 배포를 위해 정리한 내용

 

우선, Django 는 Web Framework 라는 생각으로, 그럼 Django 를 사용할 때 웹 서버는 무엇인지에 대한 의문으로

 

검색을 시작했다. 

 

우선, 결론적으로 말하자면 Django 는 웹 서버가 아니다!!

 

Django 란 ? 

 

django

 

  1.  Django 개념

 

    -  파이썬으로 작성된 오픈 소스 웹 프레임워크이다. 즉, Web Server 가 아닌 ' Web Application Framework ' 이다.

 

    -  Django는 모델-뷰-컨트롤러의 MVC 패턴을 따르고 있다.

 

 

  2.  Django 서버 실행

 

    -  Django 프로젝트 생성 후 서버를 실행할 때, 아래 명령어를 사용하는데

 

./manage.py runserver (= python manage.py runserver)

 

   

    -  위의 명령어를 사용하는 경우는, 디버그 용으로 Local 에서만 실행할 때 사용해야하며,

 

    -  실제 Production 환경에서는 사용하지 않는 것이 옳다.

 

Web Server 란 ? 

 

  1.  Web Server 의 개념

 

    -  HTTP 프로토콜로 요청을 받아, HTML 문서 등과 같은 정적 웹 페이지를 응답해주는 소프트웨어이며,

 

    -  하드웨어와 소프트웨어 측면의 웹 서버가 존재한다. 

 

 

Web Server

 

 

  2.  하드웨어/소프트웨어 측면의 웹 서버

 

하드웨어 측면 소프트웨어 측면
웹 사이트의 컴포넌트 파일들을 저장하는 컴퓨터

  -  컴포넌트 파일 : html 문서, images, css stylesheets, javascript 파일 등

  -  컴포넌트 파일들을 -> 최종 소비자의 디바이스에 전달

  -  웹 서버는 인터넷에 연결되어 있고, 도메인 이름을 통해 접속 가능
웹 사용자가 어떻게 호스트 파일들에 접근하는지를 관리

  -  HTTP server : URL(Web address) & HTTP 소프트웨어의 일부

 

 

  3.  Web Server 의 역할

 

    -  웹 페이지를 클라이언트로 전달하는 것이 Web Server 의 역할이다.

 

    -  주로, 그림이나 CSS, 자바스크립트를 포함한 정적인 HTML 문서가 클라이언트로 전달된다.

 

 

  4.  Web Server 예시

 

    -  대표적인 예시로는, Ngnix, Apache, GWS 등이 있으며 최근 Ngnix를 많이 쓴다고 한다.

 

    +  Apache 와 Ngnix 차이

 

Apache Ngnix
Request에 대해 Process를 하나씩 처리 Event-Driven 방식으로, 비동기 처리

 

 

WSGI 란 ? 

 

  1.  WSGI 개념

 

    -  WSGI = Web Server Gateway Interface의 약자로,

 

        Python Application(Python Script)이 Web Server와 통신하기 위한 표준 Interface이다.

 

    -  python Framwork 로, 일종의 프로토콜에 해당한다.

 

  

  2.  WSGI 의 필요성

 

    -  Ngnix와 Apache와 같은 서버들은, Django 나 Flask로 작성한 Web Application 을 이해하지 못해, 

 

   ->  WSGI를 이용해 웹 서버와 우리가 작성한 애플리케이션이 서로 통신할 수 있게 하는 것이다.

 

 

  3.  WSGI server(Middleware)

 

    (1)  WSGI server 의 필요성

 

      -  웹 서비스를 개발하다 보면, '쿠키나 세션, 인증, 라우팅 등'의 공통적으로 사용하는 기능이 있는데, 

 

      -  WSGI 자체는 서버나 프레임워크 자체가 아니라 해당 기능들을 매번 개발해야 한다. 

 

     ->  따라서, 이러한 기능들을 구현해 확장할 수 있도록 한 것이 WSGI Middleware 이고, 

 

      ->  WSGI Middleware 는 Web Application 실행 전후 공통적으로 사용하는 기능들을 추가해주는 것이다. 

 

      ->  즉, 그 자체로 WSGI Application 이라고 할 수 있다. 

 

 

    (2)  WSGI Middleware 예시

 

      -  Gunicorn, uWSGI, Werkzeug, mod-wsgie

 

 

    (3)  기능

 

      1)  환경변수가 바뀌면, 타겟 url 에 따라 Request 경로 지정

 

      2)  같은 프로세스에서, 여러 애플리케이션과 프레임워크가 실행되게 함.

 

      3)  XLST 스타일 시트를 적용하는 것과 같이 전처리

 

 

      -  WSGI request 를 처리하려면, 

 

         서버 단에서 ---- 환경 정보 & 콜백 함수를 ----> 애플리케이션 단에 제공해야 하고,

 

         애플리케이션은 ---- 그 요청을 처리하고 ---- 미리 제공된 콜백 함수를 통해 ----> 서버 단에 응답 하는데,

 

     ->  이때, WSGI Middleware 가 서버와 애플리케이션 사이를 보충해준다.

 

      -  서버 관점에서는 -> 애플리케이션으로, 

 

      -  애플리케이션 관점에서는 -> 서버로 행동하는 것이다.

 

HTTP request  -->  Web Server  -->  WSGI Server(Middleware)  -->  Django(WSGI 지원)

 

 

Gunicorn

 

  1.  gunicorn 개념

 

    -  gunicorn 은 Python WSGI HTTP Server 로,

 

    -  위에서 언급한 것과 같이 WSGI Middleware 의 기능을 가진 라이브러리이다.

 

gunicorn

 

  2.  gunicorn 특징

 

    1)  WSGI, Web2py, Django 지원

 

    2)  Automatic worker process management

 

    3)  간단한 Python Configuration

 

    4)  Multi worker Configuration

 

    5)  확장성(Extensibility) 을 위한 다양한 Server hook

 

    6)  python2.6+ 와 python3.2+ 과 호환 가능

 

 

  3.  Django에서 사용

  

    -  Django 에서 startproject 를 통해 생성한 프로젝트의 구조로는, 아래와 같은데

 

Django Project Structure

 

    -  wsgi.py 에서 application = get_wsgi_application() 을 통해 wsgi handler 를 가져온다.

 

    -  wsgi handler 에서는 middleware 등을 처리하고,

 

    -  WSGI Server 에서는 설정을 읽어 application 의 경로를 가져온다.

 

    -  Django의 기본 명령어 runserver 는 WSGI APPLICATION 설정에서 경로를 가져온다.

 

 

Nginx, WSGI Server(gunicorn), Django 관계

 

 

 

 

참고

 

  -  https://velog.io/@han0707/WSGI%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

  -  https://jay-ji.tistory.com/66

  -  https://velog.io/@muchogusto/%EC%9B%B9%EC%84%9C%EB%B2%84%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

 

* 이후 추가 : Web Server 와 WAS(Web Application Server) 차이 정리

 

  -  참고 : https://devmoony.tistory.com/113