LearnRun
Application server와 CGI 본문
◈ Contents
꾸준히 찾아보고 있는데,
조사하는 것 마다 좀 차이가 있는 것 같습니다.
계속 보강하겠습니다.
Application Server
서비스 및 리소스를 호스트, 제공 및 관리하도록 설계된 서버 측 소프트웨어 프레임워크입니다.
클라이언트 요청과 기본 시스템, 데이터베이스 및 이러한 요청을 이행하는 데 필요한 기타 리소스 사이에서 중개자 역할을 합니다.
네트워크와 연결된 경우에 요청자와 통신을 할 수 있는 서버이며, HTTP, UDP, TCP 등 다양한 프로토콜을 매개로 클라이언트에 서비스를 제공할 수 있습니다.
일반적으로 Web page를 띄우는 것 이상의 개념, 즉 DB 연동, 로드밸런싱, fail-over 등을 처리하기도 합니다.
Web Server
웹 클라이언트의 HTTP 요청에 대한 응답으로 HTML 파일, 이미지 및 비디오와 같은 정적 콘텐츠를 제공하도록 설계된 소프트웨어입니다. 웹 서버는 웹 클라이언트(예: 웹 브라우저)와 웹 애플리케이션 간의 인터페이스 역할을 합니다. 웹 서버의 몇 가지 예로는 Apache HTTP Server, Nginx 및 Microsoft IIS가 있습니다.
- Apache HTTP Server
동적 콘텐츠를 제공하고 웹 애플리케이션을 실행하는 데 널리 사용되는 오픈 소스 웹 서버입니다. 높은 수준의 사용자 정의 및 유연성으로 유명하여 개발자들 사이에서 인기 있는 선택입니다. - Nginx
트래픽이 많은 웹 사이트를 제공하는 데 자주 사용되는 고성능 오픈 소스 웹 서버입니다. 낮은 메모리 사용량, 높은 확장성 및 많은 수의 동시 연결을 처리하는 기능으로 알려져 있습니다. - Microsoft IIS (Internet Information Services)
Microsoft에서 Windows 운영 체제용으로 개발한 웹 서버입니다. .NET 웹 애플리케이션을 제공하는 데 자주 사용되며 고성능, 보안 기능 및 사용 편의성으로 유명합니다.
Web Application Server (WAS)
웹 클라이언트의 HTTP 요청에 대한 응답으로 웹 콘텐츠의 동적 처리 및 생성을 처리하도록 설계된 서버측 소프트웨어입니다. 웹 애플리케이션 실행을 위한 런타임 환경을 제공하며 웹 서버와 애플리케이션 사이의 미들웨어 역할을 합니다. 웹 애플리케이션 서버의 몇 가지 예는 다음과 같습니다.
- Apache Tomcat
Java 기반 응용 프로그램을 개발, 테스트 및 배포하는 데 사용할 수 있는 가볍고 고도로 사용자 지정 가능한 응용 프로그램 서버입니다. 간단하고 사용하기 쉬운 것으로 알려져 있습니다. - JBoss(WildFly)
Java 애플리케이션 개발, 테스트 및 배포를 위한 포괄적인 기능 및 도구 세트를 제공하는 Java 기반 애플리케이션 서버입니다. 유연성과 성능으로 유명합니다. - GlassFish
Java EE 기반 응용 프로그램을 구축, 배포 및 관리하기 위한 완벽한 솔루션을 제공하는 Java 응용 프로그램 서버입니다. 높은 성능, 확장성 및 안정성으로 유명합니다.
(번외)Web Framework
WAS는 컨텐츠 전송을 처리하기 위한 리소스와 서비스를 제공하는 소프트웨어 프로그램인 반면,
Web Framework는 웹 애플리케이션을 빌드하고 실행하기 위한 일련의 도구와 라이브러리를 제공합니다.
프레임워크에 따라 WAS의 기능을 일부 갖고 있기도, 또 아예 없는 경우도 있어 분류가 모호해 따로 분리했습니다.
가령, Django의 경우 WAS와 같이 Web app을 빌드, 실행하기 위한 플랫폼 역할을 할 수 있습니다. 동적 페이지 생성이나, 클라이언트와의 상호작용, 이외의 App 작업을 진행할 수 있습니다. 더불어, 인증 기능을 비롯한 보안 기능, 웹 개발의 편의성을 위한 도구와 라이브러리를 지원한다는 점이 비슷합니다.
반면 Flask의 경우 수신 요청 처리와 같은 기능이 별도로 내장되어 있지 않아 WGSI, Nginx에 의존적입니다.
하지만 WAS처럼 컨텐츠의 전송을 주 목적으로 개발되지 않았으므로, 기능을 일부 내포하고 있더라도 엄밀히 말하면 다르다고 할 수 있겠습니다.
- Django
웹 애플리케이션을 빠르게 구축할 수 있는 고수준 웹 프레임워크입니다.
내장된 개발 서버가 포함되어 있으며 별도의 웹 서버와 함께 사용할 수도 있습니다. - Flask
웹 애플리케이션을 구축하기 위한 최소한의 기능을 제공하는 경량 웹 프레임워크입니다.
중소규모 프로젝트에 주로 사용되며 필요에 따라 추가 기능으로 쉽게 확장할 수 있습니다. - Pyramid
작은 단일 페이지 애플리케이션부터 수백 페이지의 복잡한 애플리케이션까지 다양한 웹 애플리케이션을 구축하는 데 사용할 수 있는 유연하고 확장 가능한 웹 프레임워크입니다. - Tornado
긴 폴링 및 웹소켓 처리에 최적화된 확장 가능한 웹 서버입니다.
실시간 웹 애플리케이션을 구축하는 데 자주 사용되며 수천 개의 연결을 동시에 처리할 수 있습니다.
Web Server와 WAS의 차이점
차이는 다음과 같이 표로 간략하게 정리했습니다.
Web Server | WAS | |
정적 컨텐츠의 제공 | 목적 | 동적 컨텐츠의 처리 및 생성 |
컨텐츠의 효율적인 전달 (성능 및 보안) | 기능 | ORM을 비롯한 응용 프로그램의 기능 탑재 |
정적 컨텐츠 전달의 최적화 | 성능 | 추가 기능을 위한 성능 조율 |
네트워크 서버 추가를 통한 확장 | 네트워크 확장성 | 복잡함, 확장하기 어려움 |
CGI (Common Gateway Interface)
Web Server와 Web App을 연결하는 규약입니다. Application이 데이터를 처리, 출력하고 처리 결과를 Web Server에서 수신할 수 있도록 하는 것이 CGI의 역할입니다. CGI를 이용하여 웹사이트에서 기능을 확장할 수 있습니다.
동적 웹 페이지를 생성하기 위해 Web server에서 스크립트를 실행하기 위한 표준으로, 웹 서버가 클라이언트의 Request에 대한 Response으로 스크립트를 실행할 수 있는 방법을 제공, 클라이언트에게 동적 및 대화형 웹 페이지를 제공할 수 있습니다. 스크립트는 실시간으로 실행되고 스크립트의 출력은 HTML로 클라이언트에 다시 전송된 다음 클라이언트의 웹 브라우저에 표시됩니다.
- 클라이언트는 웹 서버에 리소스에 대한 HTTP 요청을 보냅니다.
- 웹 서버는 요청된 리소스가 CGI 프로그램에 의해 처리되어야 함을 인식하고 CGI 프로그램을 호출합니다.
- CGI 프로그램은 서버에서 별도의 프로세스로 실행되며 HTTP 응답을 생성합니다.
- CGI 프로그램은 HTTP 헤더와 응답 내용을 출력합니다.
- 웹 서버는 CGI 프로그램에서 응답을 수신하여 HTTP 응답으로 패키징한 후 클라이언트로 다시 보냅니다.
- 클라이언트는 HTTP 응답을 수신하고 그에 따라 처리합니다.
동적 웹 페이지를 만드는 데 널리 사용되었으나, 스크립트를 매번 다시 실행하는 등 성능 문제로 인해 WSGI나 FastCGI같은 보다 현대적인, 효율적인 기술로 대체되었습니다.
FastCGI
FastCGI는 CGI보다 효율적으로 웹 애플리케이션과 웹 서버를 연결할 수 있도록 디자인되었습니다.
웹 서버와 웹 애플리케이션 간의 연결을 지속적으로 유지, 요청이 있을 때마다 매번 새로운 프로세스를 생성하는 것이 아닌, 이전에 생성된 프로세스를 재사용하여 처리 속도를 개선하였습니다.
요청을 처리하고 동적 웹 페이지를 생성하기 위해 별도의 프로세스가 생성됩니다. 프로세스는 메모리에 남아 있으므로 이후의 요청을 더욱 효율적으로 처리할 수 있습니다. 이렇게 하면 들어오는 각 요청에 대해 새 프로세스를 시작할 필요가 없어 시간과 리소스를 크게 아낄 수 있습니다.
본 기능은 상단의 Apache, Nginx, IIS와 같은 대부분의 Web Server가 제공합니다.
WSGI(Web Server Gateway Interface)
Web Server가 WAS 또는 프레임워크와 통신하기 위한 Python 표준입니다.
둘 사이를 매개하는 공통 인터페이스를 제공, 요청을 보다 쉽게 배포하고 보다 효율적으로 처리할 수 있습니다.
CGI와 마찬가지로 웹 애플리케이션의 처리 결과를 웹 서버에서 출력할 수 있도록 하지만, 보다 바로 처리할 수 있는 기술을 제공합니다.
동작 순서
- 클라이언트는 Apache 또는 Nginx와 같은 웹 서버에 HTTP 요청을 보냅니다.
- 웹 서버는 요청을 Gunicorn 또는 uWSGI와 같은 WSGI 호환 애플리케이션 서버로 전달합니다.
- WSGI 서버는 WSGI 인터페이스를 구현하는 Flask 또는 Django와 같은 Python 애플리케이션 또는 프레임워크를 인스턴스화합니다.
- WSGI 서버는 들어오는 HTTP 요청을 호출 가능한 객체로 Python 애플리케이션에 전달합니다.
- Python 애플리케이션은 요청을 처리하고 필요한 연산을 수행한 후 HTTP 응답을 생성합니다.
- Python 애플리케이션은 HTTP 응답을 호출 가능한 객체로 WSGI 서버에 반환합니다.
- WSGI 서버는 HTTP 응답을 웹 서버로 다시 전달합니다.
- 웹 서버는 HTTP 응답을 클라이언트로 전송합니다.
WSGI 미들웨어 목록
일반적으로 Gunicorn이 가장 널리 사용되고, 기타 사용되는 WSGI 서버로는 uWSGI, mod_wsgi(Apache HTTP Server용) 및 Waitress가 있습니다.
- Gunicorn
Gunicorn은 Django, Flask 등과 같은 Python 프레임워크를 사용하여 작성된 Web Application의 라이브 서버로 사용할 수 있습니다. - uWSGI
풀스택 WSGI입니다. Web Server와 WAS 간의 게이트웨이로 사용할 수 있습니다. - mod_wsgi
Python 웹 애플리케이션을 호스팅하기 위한 WSGI 인터페이스를 제공하는 Apache HTTP 서버 모듈입니다.
기존 Apache 구성 및 모듈과 잘 작동하도록 설계되었으며 Python 웹 애플리케이션을 위한 고성능의 안정적인 게이트웨이를 제공합니다. - Waitress
순수 Python WSGI 서버입니다. 가볍고 빠르며, 효율적으로 설계되었습니다.
다양한 Python 웹 프레임워크와 호환되며, 소규모 및 트래픽이 적은 웹 응용 프로그램을 제공하는 데 적합합니다.
Nginx 등의 Web Server에서 Fast CGI를 지원함에도 WSGI를 사용하는 이유
WSGI는 앞에서 설명한 바와 같이, Python Web Application Server를 위한 표준 인터페이스를 제공합니다.
FastCGI의 경우 타 프로그래밍 언어로 작성된 WAS, 프레임워크 등에서 사용할 수 있는 범용 인터페이스입니다.
즉, Python 기반의 Framework로 작업을 하고자 함에 있어 Nginx+Gunicorn+django 등으로 묶는 이유는, django와 같은 웹 프레임워크와 Python 라이브러리가 WSGI를 보다 더 지원하기 때문입니다.
가령, CGI는 요청이 들어올 때 매번 스크립트를 처음부터 실행해 서버에 부하가 걸리지만, 그와 달리 WSGI의 경우, 요청에 따라 필요한 로직만 실행해 결과를 반환합니다.
또한, WSGI는 FastCGI보다 오류 처리가 더욱 뛰어나고, 배포에 용이하다고 기술되어 있습니다.
동작 모식도
1. 사용자의 액션에 따라 브라우저가 요청을 보내고, 이에 Web Server가 HTML문서를 먼저 보냅니다.
2. 이미지 파일 등 정적 컨텐츠 요청이 추가로 올 때 WAS로 부하를 줄 필요 없이, Web Server가 앞단에서 컨텐츠를 보냅니다.
3. 동적 컨텐츠 요청이 있으면, CGI를 통해 WAS로 요청을 보내고, 그에 맞게 WAS는 데이터를 Web Server로 보냅니다.
Gunicorn과 django는, 위에서 말한 바와 같이 역할이 정확히 나눠져있지는 않습니다.
찾아본 바로는 둘을 묶어 WAS로 언급하는 글이 많아, python django 기반의 프로덕션 서버 모식도를 이와 같이 묘사하였습니다.
Nginx는 리버스 프록시, 부하 분산 등의 기능을 위해 가장 전방에 두고, 이후 Gunicorn은 Django 등의 Web Application 에 HTTP 요청을 전달하기 위해 WSGI로서 기능합니다.