ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WSGI, WAS, CGI 이해
    서버 2017. 4. 19. 11:42

    개요

    각 언어마다 WAS와 같이 서버 언어를 처리하도록 하는 동작이 각기 상이합니다. 아래는 하나씩 설명하며 각각 비교를 설명합니다.

    웹 서버

    인터넷을 통해서 요청된 웹 컨텐츠(이미지, html, 등)의 전달을 도와주는 하드웨어와 소프트웨어를 말합니다. 웹서버는 기본적으로 '정적'입니다. 클라이언트가 HTTP 리퀘스트를 통해 리소스를 요청하면, 그 리소스를 그대로 보내주는게 웹 서버의 역할입니다.

    CGI(Common Gateway Interface)

    웹 서버에서 어플리케이션을 작동시키기 위한 인터페이스입니다. 정적인 웹서버를 동적으로 기능하게 하기 위해서 등장하였습니다. 서버 프로그램과 외부 프로그램 간의 인터페이스가 바로 CGI입니다. 근래에는 웹 서버의 프로세스로서 인터프리터를 상주시킴으로써, CGI로부터 프로그램을 호출해 부하를 줄임으로써 성능을 개선한 Java Servlet나 mod perl, mod php, FastCGI 등도 공개되었습니다. 기존에는, 웹서버가 있고 클라이언트에서 외부 프로그램이 필요한 리퀘스트가 들어오면 CGI를 통해 외부 프로그램을 실행시켜 리퀘스트에 응답하도록 했지만 요즘에는 웹서버에 인터프리터를 내장함으로써 따로 프로세스를 fork하여 외부 프로그램을 실행시키지 않고 내부에서 다 처리합니다.

    방식

    요청 ->  웹서버(아파치, nginx 등) -> (웹서버가 직접실행프로그램(Perl, C/C++ 등)

    웹서버와 프로그램 사이의 정보를 주고받는 규칙을 의미하고  CGI 프로그래밍이란, Perl, C/C++ 등을 사용하여 웹서버가 실행할 수 있는 프로그램을 작성하는 것을 의미합니다.

    WAS(Web Application Server)

    WAS는 웹서버가 동적으로 기능하면 WAS입니다. 즉, Web Server + CGI가 WAS입니다. 우리가 하는 소규모 프로젝트에서는 일반적으로 웹서버와 WAS를 굳이 구분할 필요가 없으며, 후에 필요에 따라 서버를 분리할 때 이를 구분하긴 하는데 이때도 사실 용어가 중요한지는 의문이 들긴 합니다. 간단하게 말해 웹서버 위에 서버 어플리케이션을 얹은 것이 WAS입니다.

    방식

    요청 -> 웹서버) -> 웹 어플리케이션 서버(톰캣, JBoss 등) -> (웹어플리케이션 서버가 실행)프로그램

    어플리케이션 서버가 프로그램의 실행결과를 웹 서버에 전달해주며 웹 서버는 전달 받은 결과를 웹 브라우저에 전송합니다. (JSP, ASP.net 등)

    ※CGI, 어플리케이션 서버 방식의 차이

    접속자가 많은 서비스의 경우 CGI 방식보다 어플리케이션 서버 방식의 Throughput(처리량)이 더 좋습니다.

    예를들어, 5개의 웹 브라우저가 동일한 프로그램을 요청했을 때 CGI 방식은 5개의 요청에 대한 프로그램을 모두 메모리에 적재합니다. 반면, 어플리케이션 서버방식은 메모리에 한번만 적재합니다. 이로써 CGI방식에 비해 전체적인 메모리 사용량이 적습니다. 이는 더 많은 요청을 처리할 수 있음을 의미합니다.

    WSGI(Web Server Gateway Interface)

    파이썬에서 어플리케이션, 즉 파이썬 스크립트(웹 어플리케이션)가 웹 서버와 통신하기 위한 인터페이스입니다. 프로토콜 개념으로 이해할 수도 있습니다. WSGI는 서버와 앱 양단으로 나뉘어져 있습니다. WSGI 리퀘스트를 처리하려면 서버에서 환경정보와 콜백함수를 앱에 제공해야 합니다. 앱은 그 요청을 처리하고 콜백함수를 통해 서버에 응답합니다.

    방식

    요청 -> 웹서버 -> WSGI Server(middleware라고도 함) -> WSGI를 지원하는 웹어플리케이션(Django, flask 등) 

    WSGI Server(middleware)

    웹 서버와WSGI를 지원하는 웹어플리케이션 사이에서 동작하며, 아래와 같은 일을 합니다.

    • 환경변수가 바뀌면 타겟 URL에 따라서 리퀘스트의 경로를 지정해줌
    • 같은 프로세스에서 여러 애플리케이션과 프레임워크가 실행됨
    • XSLT 스타일시트를 적용하는 것과 같이 전처리함

    WSGI Server(middleware)는 mod_wsgi, uwsgi, gunicorn, twisted.web, tornado 등이 있습니다.

    WSGI, CGI 방식의 차이

    아파치는 80번 포트를 듣고 있다가, 리퀘스트가 들어오면 이를 해석해서 응답합니다. 응답의 방법은 다양한데, 그중 하나는 CGI를 통해 스크립트를 실행시키는 것이고 다른 하나는 단순히 파일을 제공하는 것입니다. CGI의 경우, 아파치는 환경을 준비하고 CGI 프로토콜에 따라 스크립트를 실행시킵니다. CGI 서브프로세스는 소켓과 stdout을 포함하여 OS 환경을 상속합니다. CGI 서브프로세스가 response를 작성하고, 이를 아파치로 보내면, 아파치는 이 response를 브라우저로 보냅니다. CGI는 원시적이라고 볼 수 있습니다. 대부분 CGI는 모든 리퀘스트마다 서브프로세스를 fork합니다.

    반면 WSGI는 CGI 디자인 패턴에 기반한 인터페이스입니다. 하지만 WSGI가 항상 CGI는 아닙니다. WSGI는 모든 리퀘스트에 대해 서브프로세스를 다 fork하지 않습니다. WSGI는 CGI가 될수도 있고 아닐수도 있습니다. WSGI는 CGI 디자인 패턴을 몇가지 중요한 방식으로 더했습니다. HTTP Request Header를 파싱하고 이를 환경에 추가합니다. 이것은 환경에서 file-like object로써 POST-oriented input을 제공합니다. 또한 사용자에게 수 많은 format 디테일로부터 해방시키고 response를 만들 수 있는 기능을 제공합니다.

    다시말해, WSGI가 CGI 디자인 패턴을 가져다 업그레이드 한 모델입니다. CGI는 모든 리퀘스트마다 fork를 통해 서브프로세스를 띄워 요청을 처리하므로 느리지만 WSGI는 그렇지 않으므로 좋습니다.

    WSGI, FCGI

    WSGI는 파이썬에 종속된 개념이고, FCGI는 언어와 상관없는 socket wire 프로토콜입니다. WSGI가 더 높은 레이어에서 동작하며, 따라서 WSGI-FCGI를 동시에 사용할 수 도 있습니다.

    댓글