WSGI(web server gateway interface)는 web application(ex. Django, Flask...)과 web server(ex. Apache, Nginx...) 간의 통신 규약으로 파이썬 언어로 작성한다.
사용자가 브라우저에 URL을 입력하면, 브라우저는
웹 서버에 웹페이지를 보내달라는 요청을 한다.
웹 서버는 HTTP 요청을 파싱한 후, 정적 컨텐츠(HTML, CSS, PNG...)을 저장하고 있다가 브라우저에게 보내준다. (대표적으로 Apache, Nginx가 있다.)
브라우저와 웹 서버는 HTTP(HyperText Transfer Protocol)로 통신한다. 기본적으로 클라이언트와 서버 간에 요청과 응답이 1:1 구조를 띠고 있어 한 화면을 구성하는 콘텐츠가 100개라면 요청과 응답이 100번 이뤄지게 된다.
브라우저의 요청을 가장 먼저 받는 서버로 정적 컨텐츠 응답 이외에도 로드발란싱, 캐싱 등 다양한 기능을 할 수 있다.
웹 어플리케이션 서버(WAS)는 웹 서버에서 처리하지 못하는 동적 컨텐츠를 처리해 웹 서버에게 응답한다. 주로 비즈니스 로직을 수행한다. (예. Django, Flask)
웹서버와 웹애플리케이션이 별도의 서버에 나누어진 이유는?
웹 어플리케이션 서버가 등장하기 이전에는 웹 서버에서 동적 컨텐츠를 처리하기 위해서 자체적으로 process를 fork해서 어플리케이션 코드를 수행했다. 그러나 매 요청마다 process를 fork하게 되면 요청에 대한 응답이 느릴 수 밖에 없다. 이를 방지하기 위해서 웹 어플리케이션 서버를 따로 두고, 동적인 요청은 웹 어플리케이션 서버로 보내서 처리하게 되었다.
웹 어플리케이션 서버를 별도로 두다 보니, 웹 서버와 웹 어플리케이션 서버 간의 통신하는 규칙이 필요했고 그래서 WSGI가 나오게 되었다. WSGI는 여러 종류의 웹 서버(Nginx, Apache)와 여러 종류의 웹 어플리케이션(Django, Flask)이 서로 종속성이 없이 모두 통신이 가능하도록 하기 위해서 만들어졌다.
WSGI는 Gunicorn, uWSGI와 같은 WSGI middleware에서 제공하기 때문에 직접 구현하지 않아도 된다. WSGI middleware웹 서버가 브라우저로부터 요청을 받으면 웹 서버는 WSGI middleware에 요청을 전달하고, 미들웨어는 이 요청을 어플리케이션에 전달한다.
