WSGI란?
WSGI는 Web Server Gateway Interface의 줄임말로 파이썬의 표준 게이트웨이 인터페이스입니다.
파이썬에서의 CGI정도로 이해하시면 됩니다만 더 쉽게 생각하자면 일종의 프로토콜 처럼 생각할 수도 있겠습니다.
WSGI의 역할
기본적으로 웹 서버 자체는 정적인 페이지 밖에 보여주지 못합니다.
우리가 인터넷에서 보는 동적인 페이지들은 웹 서버가 전적으로 처리하는 것이 아니라 웹 어플리케이션(장고, 플라스크 등으로 작성된 프로그램)의 도움으로 보게 되는 것이죠.
그렇다면 당연히 웹 서버와 웹 어플리케이션은 서로 소통을 할 수 있어야겠죠? 그래야 동적인 페이지를 만드는 데 필요한 정보를 주고 받을 수 있으니까요.
하지만 안타깝게도 아파치, Nginx 등의 웹 서버는 파이썬 코드를 이해하지 못합니다. 그래서 생으로 웹 서버와 파이썬 웹 어플리케이션은 소통을 할 수가 없죠.
이제 대충 감이 오시나요?
인터페이스라는 단어에 익숙하신 분들은 눈치채셨겠지만 WSGI는 이 때를 위해 존재합니다.
웹 서버와 파이썬 웹 어플리케이션 간의 인터페이스 역할을 하는 것이죠.
전체적인 흐름을 그림으로 그리면 대충 다음과 같습니다.
1. 클라이언트에서 요청을 보냅니다.
2. 웹 서버에서 요청을 받습니다. 이 때 동적인 페이지를 요청했다면 WSGI 서버(미들웨어라고도 합니다)를 호출합니다.
3. WSGI 서버는 WSGI를 사용하는 웹 어플리케이션(예시: 장고)을 호출합니다.
4. 호출받은 웹 어플리케이션은 요청에 따라 적절한 처리를 수행합니다.
5. 수행 결과를 다시 WSGI 서버를 통해 웹 서버로 전달하고, 웹 서버는 최종 응답을 클라이언트로 보냅니다.
대표적인 WSGI 서버로는 uWSGI, mod_wsgi, Gunicorn 등이 있습니다.
WSGI와 CGI의 차이
CGI는 플랫폼에 상관없이 동작 가능하며, 매번 요청에 대해 프로세스를 생성(fork)한다는 특징이 있습니다. 따라서 요청이 많아질수록 성능이 저하됩니다.(HTTP의 동작 방식과 비슷하다고 생각할 수도 있습니다.)
반면 WSGI는 파이썬에 종속적입니다. 또한 CGI의 디자인 패턴을 기반으로 제작되긴 했지만 동작방식이 CGI와는 차이가 좀 있습니다.
1. WSGI는 매번 요청에 대해 프로세스를 생성(fork)하지 않습니다. 따라서 요청이 많아도 성능 저하가 거의 없습니다.
2. WSGI는 웹 어플리케이션을 호출할 때 요청(request)의 헤더 부분을 환경 정보로 전달하며 이 때 콜백 함수도 같이 전달합니다. 그 후 웹 어플리케이션이 요청을 처리하고 콜백 함수로 응답하는 방식입니다.
즉 WSGI가 CGI보다 상위 모델이라고 생각할 수 있습니다.
장고에서의 WSGI
WSGI 서버는 장고와 통신할 때 '프로젝트명/config/wsgi.py' 경로에 있는 이 파일을 통해 장고 어플리케이션을 호출합니다.
이 파일은 웬만해선 딱히 건들 필요가 없지만 혹시나 프로젝트의 디렉터리 구조를 조금 손봐서 settings.py 파일이 이동하게 된다면 그 경로를 반드시 수정 해주셔야 합니다.
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
# ----------------- 이 부분이 settings.py의 경로
application = get_wsgi_application()
사족으로, 장고의 내장 서버는 WSGI의 기능을 자체적으로 포함하고 있습니다.(python manage.py runserver로 동작하는 서버)
이 외에도 장고에는 WSGI의 상위 호환격인 ASGI(Asynchronous Server Gataway Interface)가 있습니다.
찾아보니 WSGI를 비동기식으로 동작시킬때 발생하는 문제들을 해결한, 비동기 방식에 초점을 둔 인터페이스로 추정되는데
사실 저도 얘는 잘 모르겠습니다.
그러니 나중에 따로 공부하고 사용해 본 후 내용을 추가하도록 하겠습니다.
'Django' 카테고리의 다른 글
장고(Django) - media 파일 다루기 (1) | 2021.03.23 |
---|---|
장고(Django) - 마이그레이션(Migration) (4) | 2020.11.12 |
ORM(Object Relational Mapping)이란? (2) | 2020.10.20 |
장고(Django) - MVC패턴과 MTV패턴 (0) | 2020.10.19 |
장고(Django) - Field lookup (0) | 2020.10.09 |