WSGI

이재문·2022년 3월 29일
0
post-thumbnail

WebServer를 공부하며 알게 된 흥미로운 사실이 있다.
실제 배포환경에선 지금까지 내가 친 python manage runserver로 서버를 열면 안된다. 라는 것이다 .
아래는 Django 공식문서에 runserver에 대한 내용중 하나이다.
보안상 문제와 여러가지 문제로 실제 배포환경에서 runserver를 사용하면 안된다고 한다. Django는 Web Framework를 만들지 Web Server를 만드는게 아니기 때문에 production환경을 처리할 수 없다고 한다.

이전 포스트에서 DjangoWAS라고 했다.
나는 Client와 WAS(Web Application Server)를 잇기 위해 WS(Web Server)를 써야 한다고도 했다. 그리고 Nginx를 공부하며 WSGI(Web Server Gateway Interface)의 존재를 알게 되었고 wsgi를 이용하여 WAS와 WS를 연결해야 한다는 것을 알았다.

WSGI란?

Web Server Gateway Interface라는 이름에서 유추 할 수 있듯 서버 관문 인터페이스이고, 'WS'와 'WAS'간의 연동 규격이다.

  • *CGI라는 규격의 단점을 보완하기 위해 생겨났다.
  • python '웹 어플리케이션'에서 WSGI를 통해 CGI처리가 된다.
  • python로 작성을 하기 때문에 python 기반 'WAS'에 최적화되어있다.
    종류 -> uwsgi, guncorn 등

*CGI(Common Gateway Interface) : 'WS'와 'Process'간의 연동 규격
클라이언트 측에서 요청이 전달되면 웹 서버가 각각 CGI프로그램을 직접 실행하고 호출한다(표준 응답, 표준 출력 형태로).
단점 : 요청이 하나가 올 때마다 플로세스가 하나씩 생성되기 때문에 치명적

특징

  • 클라이언트 요청시 WSGI가 'WAS'을 간접적으로 생성한다.
  • 요청에 대해 매번 프로세스를 실행 시키지 않는다. - 요청에 따라 성능 저하 X
  • WS(Nginx, Apache등)을 사용할 때 'WAS'와 사이에 WSGI 통신 규격을 처리 해 주는 WSGI가이 필요하다. - WS에는 WSGI규격을 처리하는 기능 X
  • HTTP 응답으로 단일 처리만 가능한 동기(Synchronous)식 코드만 지원
  • 상대적으로 응답시간이 긴 Web Socket통신에는 사용하기 좋지 않다.
    동기식 응답처리 방식만 사용할 수 있기 때문에 ASGI가 생겼다.

ASGI란?

ASGI(Asynchronous Server Gateway Interface)는 'WS'와 'WAS'간의 동기, 비동기처리를 지원하는 연동 규격이다.
동기식 응답처리 방식만 가능한 WSGI의 단점을 보완해 생겨났다.
종류 -> Uvicorn,Hypercorn 등

특징

  • WSGI의 request/response가 아닌 Send/ Receive 로 되어 있어 비동기적으로 처리가 가능
  • Django Channels 기능을 제공하고 있으며, 이것은 ASGI 기반으로 만들어 졌다.
    기존의 HTTP 통신을 넘어, 웹 소켓, 채팅 프로토콜 등을 처리
  • ASGI는 WSGI의 상위 호환으로 translation wrapper(Lib-asgiref)방식으로 ASGI서버 내에서 WSGI를 실행 할 수 있다.

WS, WSGI, WAS 간의 통신 방식

Client <-> WS<-> WSGI <-> WAS

통신순서는 위 박스와 같다.

WS

  • Client에서 요청을 받아 URL을 분석한다.
  • WSGI에 정의된 URL은 WSGI로 보냄 - 나머지(static) WS상에서 처리

WSGI

  • wsgiconf에 작성된 wsgi.py 파일 실행
  • HTTP Request와 콜백함수 실행

WAS

  • Request, View처리
  • return Response

WSGI

  • 웹 서버로 처리 결과 전달

WS

  • Client로 Resopense 전달

이번 주말부로 uwsgi, nginx를 이용하여 배포를 성공했다.
(100% 성공 아님... 리버스 프록시, SSL 같은 여러가지 추가적인 기능은 사용하지 않았다 ㅠ)
이를 통해 내가 알던 runserver는 실제 서비스에서 사용해선 절대 안된다고 알게 되었고, 백엔드의 전체적인 흐름에 한 귀퉁이를 알면서 더욱 재미가 있어지고 있다!!

profile
이제부터 백엔드 개발자

0개의 댓글