CGI(Common Gateway Interface)
사용자의 요청은 웹 서버에 있는 파일을 그대로 요청하는 정적 요청과, 요청 시점에 따라 응답 내용이 달라지는 동적 요청이 있다.
일반적으로 웹 서버는 미리 준비된 정보를 이용자의 요구에 응답하여 정적인 페이지를 보내는 기능을 수행한다.
동적 요청의 경우 별도의 애플리케이션에서 처리하는 것이 일반적이며, 웹 서버는 동적 요청을 애플리케이션으로 넘겨주고 그 결과를 받는 기능을 제공한다.
이 때 웹 서버가 다른 프로그램을 호출하고, 그 처리결과를 클라이언트에 송신할 수 있게 하기 위해 웹서버와 애플리케이션 간의 프로토콜(규약)을 정한 것이 CGI이다.
웹 서버는 Apache, NGINX 등 다양한 종류가 있고, 애플리케이션 역시 python, java, php 등 다양한 언어로 작성된다.
웹 서버와 여러 언어들이 상호간의 쉽게 연동하기 위해 표준화 된 약속이 필요한데, 이를 CGI라고 하는 것이다.
즉, CGI란 서버와 애플리케이션간에 데이터를 주고 받는 방법이다.
( ex. 110V / 220V 콘센트 : V가 일치하는 전자기기는 모두 사용 가능하다.)
Ex. 회원가입
- 클라이언트가 회원가입정보 입력 후 웹서버로 요청
- 웹 서버는 회원가입정보를 애플리케이션으로 보냄(CGI 요청)
- 애플리케이션은 요청 로직을 수행하고, 실행 결과를 웹 서버로 보냄(CGI 응답)
- 웹 서버는 전달받은 실행 결과를 클라이언트에게 응답결과로 보냄
python, java 등의 프로그래밍 언어로 CGI 규격을 준수한 CGI 프로그램을 만들면, 웹 서버에서 CGI 프로그램을 호출하여 클라이언트의 요청에 대해 개별 프로세스를 생성하여 실행하는 방식으로 동작한다.
CGI 장점
CGI의 등장으로 웹 서버에 미리 저장된 HTML 뿐만아니라, 사용자의 동적 요청을 CGI 프로그램에서 처리하고, 실행 결과를 HTML로 생성하여 웹 서버로 송신할 수 있게 되었다.
CGI는 언어나 플랫폼에 있어 독립적이며, 웹 서버의 기능이 확장시키고, 웹서버와 통신할 수 있는 표준 규약을 제공한다.
CGI 단점
CGI 방식의 문제점은 클라이언트의 요청이 있을때마다 독립적인 프로세스를 생성한다는 것이다.
만약 파이썬으로 CGI 프로그램을 작성했다면, 요청이 있을때마다 파이썬 인터프리터를 각각 새로 구동하게되고 요청이 많아질 수록 프로세스가 많아져 시스템에 부하를 주게된다.
이러한 단점을 보완하여 등장한 것이 FastCGI이다.
FastCGI는 다수의 요청이 들어와도 하나의 프로세스만을 가지고 처리한다.
요청이 있을 때마다 프로세스를 생성하지 않고, 상시 프로세스를 두어 지속적으로 들어오는 요청을 처리하는 것이다.
즉 메모리에 하나의 프로그램만 적재하여 계속 재활용하기 때문에 CGI에 비해 오버헤드 위험이 적다.
CGI 방식과 달리 FastCGI를 통해 인터페이스되는 프로세스는 웹 서버가 아닌 FastCGI 서버가 관리한다.
FastCGI 방식을 사용하면 웹서버와 FastCGI 서버를 분리해 사용할 수 있기 때문에 가용성이 좋아진다.
* 특정 웹 서버에 요청이 몰려도, 다수의 FastCGI 서버를 구성하여 데이터 처리가 가능하다.
그러나 FastCGI는 특정 프로세스가 종료되지 않고, 처리를 위해 계속 상주하고 있는 형태이기 때문에 CGI 보다 메모리 소모가 더 클 수 있다는 단점이 있다.
자바 계열의 언어로 서버프로그램을 작성하면 Tomat 등 웹 애플리케이션 서버를 사용하는게 일반적이지만, 파이썬에서는 이러한 WAS가 별도로 존재하지 않기 때문에 CGI, FastCGI 등을 이용해 원하는 WAS 형태를 만들어 사용해야한다.
그래서 등장한 것이 파이썬만의 게이트웨이 인터페이스이다.
WSGI(Web Server Gateway Interface)
WSGI (Web Server Gateway Interface)는 파이썬 웹 어플리케이션이 웹 서버와 통신하기 위한 인터페이스이다.
웹서버가 클라이언트로부터 받은 요청을 파이썬 애플리케이션에 전달하여 실행하고 그 실행결과를 돌려받기 위한 약속이다.
Django와 같은 파이썬 웹 애플리케이션 프레임워크 역시, 웹 서버와 소통할 수 있는 인터페이스를 필요로 한다.
일반적으로 아래와 같은 방법으로 WSGI를 도입한다.
- nginx, apache에서 내장 모듈로 제공하는 server-often high profile 방식 (ex: mod-wsgi, mod-python 등)
- Python 코드로 작성된 Web App Server (ex: gunicorn, uvicorn, cherrypy 등)
웹 서버가 애플리케이션의 코드를 직접적으로 읽을 수 없으므로 WSGI가 해당 코드를 읽어서 결과를 대신 반환해주는 미들웨어의 역할을 한다.
WSGI 장점
CGI는 각 요청마다 새로운 프로세스를 실행한것과 다르게, WSGI는 프로세스를 한번만 시작하고, 여러 요청들을 동일한 프로세스 내에서 처리함으로써 성능을 개선하였다.
WSGI는 중간에서 요청, 응답을 수정하거나 추가적인 처리를 할 수 있는 미들웨어를 쉽게 추가할 수 있다.
WSGI 단점
- 언어독립성 : CGI는 언어에 구애받지 않았지만, WSGI는 Python 언어 전용이다.
- 배포 : WSGI는 해당하는 호환 웹서버나 애플리케이션 서버가 필요하기 때문에 설정과 관리가 더 복잡하다.
- 동기 호출 방식의 한계 :
- WSGI는 동기식 코드만을 지원하여 여러 작업을 동시에 처리하는데에 한계가 있어 현대 웹 서비스의 대용량 트래픽을 처리하는데에 어려움이 있었다.
- 길게 유지되어야하는 연결(웹소켓)이나 긴 대기시간을 가지는 HTTP 연결 등에 적합하지 않다.
* 동기식(Synchronous) : 요청을 보낸 후 해당 요청의 응답을 받아야 다음 동작을 실행하는 방식.
* 비동기식(Asynchronous) : 요청을 보낸 후 응답과 관계 없이 다음 동작을 실행할 수 있는 방식
ASGI(Asynchronous Server Gateway Interface)
파이썬에서는 비동기 처리 기능을 제공하지만, 기존 WSGI는 동기 함수 처리만을 지원하여 여러 작업을 처리하는 것에 한계가 존재했다.
ASGI는 WSGI와 비슷한 목적을 가지고 있지만 비동기 요청-응답 처리를 지원하는 등 기존의 WSGI 한계를 보완하기 위해 등장한 인터페이스이다.
ASGI는 웹서버와 프레임워크, 어플리케이션을 비동기로 연결해주는 파이썬의 표준 인터페이스이며,
WSGI와 달리 표준화 된 웹소켓 기능 을 제공하고, HTTP/2, HTTP 프로토콜 및 대용량 트래픽 처리가 가능하다.
'Spec UP - Backend > Django로 배우는 쉽고 빠른 웹개발 파이썬 프로그래밍' 카테고리의 다른 글
chap 4. Django의 핵심 기능 (0) | 2024.03.18 |
---|---|
chap 3. Django 프레임워크 (1) | 2024.02.27 |
chap 02. CGI/WSGI 라이브러리 (0) | 2024.02.20 |
chap 02. 웹 서버 라이브러리 (0) | 2024.02.20 |
chap 02. 파이썬 웹 표준 라이브러리 (1) | 2024.02.07 |
댓글