http&server

01. Web Server, WAS, CGI, WCGI에 대해

식피두 2020. 7. 29. 11:02

웹 관련 몇 가지 용어에 대해서 정리해본다.

 

 

Web Server

웹서버는 기본적으로 클라이언트로부터 요청된 웹 리소스를 서빙해주는 소프트웨어라고 정의한다.

 

기본적으로는 정적인(static) 자원을 그대로 리턴해주는 역할이 핵심이다.

동적인(dynamic) 자원을 리턴하고 싶다면 뒷단에 WAS(Web Application Server ; flask, node)를 배치하여
커뮤니케이션하면서 WAS의 결과를 서빙해주는 식으로 동작한다.

 

보통 80번 포트에서 대기하고 있고,

요청이 들어오면 해석해서 응답한다. 

CGI라는 것이 있어서 이를 통해 앱을 실행시키거나 static file을 리턴하기도 함. (CGI는 이후에 설명)

 

예시로, nginx와 apache 서버 등이 있다.

프로세스 기반의 apache 서버도, 최근에는 쓰레드를 이용해 nginx와 비슷한 성능을 보인다고 한다.

 

nginx의 기초 사용법에 대해선 이후 별도의 글에서 정리한다.

 

WAS

웹서버와 웹 애플리케이션 서버는 다르다.

WAS 는 Web Application Server를 의미함.

 

웹 서버 뒤에 붙어서 동적인 컨텐츠를 생성하는 역할을 담당한다.

 

CGI

Common Gateway Interface의 약자로, 프로토콜 느낌의 것이다.

정적인 웹 서버에서 동적인 컨텐츠를 생성하는 애플리케이션을 작동시키기 위한 인터페이스로 정의할 수 있다.

 

즉, 웹 서버와 외부 웹 애플리케이션 서버 사이의 인터페이스가 바로 CGI이다.

 

기존에는 요청이 들어오면 CGI를 통해 외부 프로그램을 실행(fork) 시켜, 응답을 했지만

(모든 요청마다 sub-process fork)

 

근래에는 인터프리터를 웹서버 자체에 내장시켜 따로 프로세스를 fork 시키지 않고 내부에서 처리하기도 한다.

 

 

WSGI

Web Server Gateway Interface의 약자이다.

 

웹서버(ex. nignx)에서 받은 요청에 대한 동적인 처리가 필요한 경우에

wsgi가 server side application(ex. flask)를 실행해준다.

 

CGI 디자인 패턴에 기반한 인터페이스로, wsgi는 파이썬에 종속된 개념이다.

 

즉, 파이썬 스크립트가 웹 서버와 통신하기 위한 프로토콜이라 할 수 있다.

 

flask나 django 같은 프레임워크는 여러 요청을 concurrently하게 처리하게끔 설계가 되어 있지 않다.

하지만 WSGI middleware(server)에서 바로 이 부분을 커버해줄 수 있다.

 

또 다르게 말하면, 웹 서버와 파이썬 애플리케이션 사이에 존재하는 개념이라 할 수 있고,

wsgi는 미들웨어 그 자체다.

 

wsgi 요청을 처리하려면 웹 서버에서 정보 및 콜백 함수를 애플리케이션에 제공해야한다.

애플리케이션은 요청 처리 후 응답을 콜백 호출을 통해 처리하며,

wsgi 미들웨어는 관련 작업을 처리해준다.

 

이 미들웨어는 웹 서버 입장에선 애플리케이션이고, 파이썬 애플리케이션 입장에선 서버로 취급된다.

 

[웹서버] --------- [미들웨어] ---------- [파이썬 애플리케이션]

 

wsgi 규격에 맞춘 코드를 실행해주는 프로그램으로

uWSGI, gunicorn 등이 있고, application container로도 불린다.

 

 

참고자료

- 파이썬 wsgi의 역사 및 개념