[Server] Web Server, WAS and CGI
Summary
- Web Server는 Client의 요청에 따라 정적인 컨텐츠를 제공하는 서버
- Web Server 단독으로는 동적인 컨텐츠를 제공할 수 없기 때문에 Application을 실행할 수 있는 Container와 Web Server를 함께 패키징한 소프트웨어
- Web Application Server가 없는 Application들은 CGI 규약을 이용해 만들어진 CGI 서버를 이용해 Web Server와 Application이 커뮤니케이션 가능
Web Server
Web Server는 사용자의 HTTP 요청에 따라 HTML, CSS, JS, 이미지 등의 정적인 컨텐츠를 제공하는 서버를 말합니다. 개발자들에게 익숙한 Apache, Nginx 등이 대표적인 웹서버입니다.
WAS(Web Application Server)
WAS란 Web Server와 Application을 실행할 수 있는 Container를 하나로 합친 형태를 가지는 소프트웨어입니다. 즉, 동적인 컨텐츠에 대한 요청이 올 경우 WAS는 컨테이너(쓰레드)에서 적절한 Application을 실행시킨 후 결과를 Web Server로 전달합니다. 이러한 WAS로는 Tomcat, Jeus 등이 널리 사용되고 있습니다.
WAS는 그 자체로 Web Server의 역할도 할 수 있지만, Web Server를 통해 정적인 컨텐츠를 빠르게 제공한 이후 Application을 통해 나온 결과를 전달하는 방식을 통해 수행 속도를 향상시킬 수 있고(예: 웹브라우저에서 HTML 문서가 로딩된 후 이미지 파일 등이 뒤이어 로딩되는 것), 컨텐츠의 종류에 따른 기능을 분리하여 서버의 부하를 방지할 수 있으며, Event loop 기반의 비동기 처리를 통해 대용량 트래픽을 동시에 처리할 수 있고, Application 내의 코드나 설정 파일 등을 직접 노출하지 않는다는 점 등의 장점 덕분에 WAS와는 별개로 Web Server를 앞 단의 두는 경우가 일반적입니다.
CGI(Common Gateway Interface)
CGI란 Web Server와 Application(Script)가 통신하기 위한 규약(Interface/Protocol)을 의미합니다. 즉, 동적인 웹서비스를 위한 표준이라고 이해할 수 있습니다. 이러한 규약이 필요한 이유는 Web Server와 Application이 사용하는 언어가 다르기 때문에 Web Server는 필요한 요청을 Application에 직접 전송할 수 없고, Application은 결과물을 Web Server에 직접 전달할 수 없기 때문입니다. 이러한 상황에서 공통의 규약이 없다면 Web Server와 Application 사이에 강한 의존성이 생기게 될 것입니다. (A라는 Web Server를 사용하기 위해서는 B라는 프레임워크만을 이용하여 Application을 작성해야 함) 따라서 CGI라는 공통의 언어를 활용하여 Web Server와 Application가 서로 데이터를 주고 받을 수 있도록 약속을 한 것이지요.
일반적으로 Client의 요청이 Application을 통해 동적으로 생성되어야 할 경우 CGI는 프로세스를 생성하여 특정 Application을 실행합니다. 문제는 요청을 받을 때마다 프로세스를 생성/삭제하여 커널 리소스의 생성/삭제가 이루어지므로 오버헤드가 심해지고 성능 저하가 일어난다는 점입니다. 최근 많은 서비스가 이용하는 Micro Service Architecture에서는 각 서비스 사이의 API를 이용한 통신이 빈번하게 일어나기 때문에 이러한 단점은 실제 사용하기에 부담스러운 측면입니다. 뒤이어 나온 FastCGI는 프로세스 하나로만 모든 요청을 처리하였으며, mod_python이라는 CGI는 Python Interpreter를 웹서버에 두어 이러한 문제를 해결하고자 하였습니다.
WSGI(Web Server Gateway Interface)
Django, Flask, FastAPI 등 Python으로 API를 개발할 때 자주 마주치는 단어인 WSGI는 Web Server와 Python Application이 통신하기 위한 규약입니다. 즉, Python을 위한 CGI인 것이지요. 대표적인 WSGI 서버(혹은 Web Server와 WSGI Application 사이에 위치하고, 인증, 쿠키 등의 기능을 Application 실행 전후로 추가할 수도 있어 WSGI Middleware/Container라고 불립니다.)로는 Gunicorn과 uWSGI가 있습니다.
ASGI(Asynchronous Server Gateway Interface)
다만, WSGI는 프로세스를 이용해 모든 요청을 처리하며, 비동기 처리가 불가능하여 성능 측면에서 아쉬운 점이 많았습니다. 이러한 단점을 보완하여 하나의 프로세스에서 비동기 처리가 가능하도록 만들어진 규약이 ASGI입니다. 대표적인 ASGI 서버로는 Uvicorn이 있습니다.
잘못된 내용, 오타, 부정확한 문장 등 어떤 피드백이든 환영합니다. 감사합니다.