podori 2022. 5. 8. 17:23

이 개념을 알기 전에 먼저 웹 서버의 역할부터 짚고 가야한다.

웹 서버란? 사용자 요청에 알맞은 (정적인)페이지 혹은 데이터를 그대로 내보내는 역할을 한다. 즉 뭔가 별도의 처리를 거치지 않고 존재하는 파일을 그대로 보내주는 역할을 한다. 그러나 보내는 내용이 계산이 필요하거나, DB에서 가져와야해서 매번 결과가 다르다면 웹 서버 혼자서 이를 수행하기에는 불가하다.

CGI(Common Gateway Interface)

:: 이를 해결하기 위해서, 웹서버가 사용자가 만든 프로그램과 통신하여 처리가 완료된 결과값을 받은 뒤 클라이언트에게 응답을 보낼 수 있는 인터페이스가 필요하다. 웹서버에서 어플리케이션을 작동시키기 위한 인터페이스로서, 정적인 웹서버를 동적으로 기능하게 하기 위해서(동적인 컨텐츠를 사용자에게 제공하기 위해서) 등장한 것이 CGI이다.

 

WAS(Web Application Server)

:: 웹서버가 동적으로 기능하면 WAS이다. 즉, Web Server + CGI를 이르는 말이다.

 

WSGI(Web Server Gateway Interface)

:: 전통적인 웹서버는 파이썬 어플리케이션들을 이해하거나 실행시킬 수가 없다. 왜냐하면, 웹서버와 파이썬 프로그램이 상호작용할 수 있는 인터페이스가 제한적이었기 때문이다. 웹서버가 호출하는 프로그램으로 파이썬을 사용하기가 힘들다는 점을 해결하기 위해서, WSGI라는 모듈과 컨테이너들이 도입할 수 있는 표준 인터페이스를 작성하게 되었다.

즉 웹서버가 Django에게 말을 걸 수 있는 수단이 필요한데 그게 바로 WSGI이다. 

 

WSGI Server

:: 웹 서버와 WSGI를 지원하는 Web Application 사이에서 동작하며 아래와 같은 일을 한다.

- 환경변수가 바뀌면 타겟 URL에 따라서 리퀘스트 경로를 지정해준다

- 같은 프로세스에서 여러 어플리케이션과 프레임워크가 실행된다

 

WSGI vs CGI

CGI는 리퀘스트가 들어오면 CGI 프로토콜에 따라서 스크립트를 실행시킨다. 서브프로세스를 fork하여 서브프로세스가 response를 작성하고 이를 웹서버로 보내면 웹서버가 response를 브라우저로 보낸다. 대부분의 CGI는 모든 리퀘스트마다 서브프로세스를 fork한다.

 

WSGI는 모든 리퀘스트마다 fork를 통해 서브프로세스를 띄우지 않으므로 느리지 않다.