맨위로가기

웹 서버 게이트웨이 인터페이스

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

웹 서버 게이트웨이 인터페이스(WSGI)는 파이썬 웹 애플리케이션과 웹 서버 간의 표준 인터페이스로, 웹 애플리케이션의 이식성을 높이기 위해 개발되었다. WSGI는 서버 측과 애플리케이션 측으로 구성되며, 요청 처리 및 응답 생성을 위한 콜백 함수와 환경 정보를 제공한다. WSGI 미들웨어를 통해 요청 라우팅, 프로세스 병렬 실행, 로드 밸런싱, 콘텐츠 후처리 등의 기능을 구현할 수 있다. 다양한 파이썬 웹 프레임워크와 웹 서버가 WSGI를 지원하며, 다른 프로그래밍 언어에도 유사한 인터페이스가 존재한다. Python 3에서는 문자열과 바이트열의 구분에 따른 문제를 해결하기 위해 PEP 3333과 같은 갱신된 사양이 공개되었다.

더 읽어볼만한 페이지

  • 파이썬 - 귀도 반 로섬
    귀도 반 로섬은 네덜란드 출신의 프로그래머로, 1989년 크리스마스 기간에 취미로 파이썬 프로그래밍 언어를 개발했으며, 구글과 드롭박스 등에서 일하다 2020년 마이크로소프트에 수석 엔지니어로 합류했다.
  • 파이썬 - 모조 (프로그래밍 언어)
    모조는 모듈러사에서 개발한 파이썬과 유사한 구문의 고성능 프로그래밍 언어로, AI 애플리케이션 개발에 초점을 맞추고 러스트의 영향을 받은 메모리 안전성을 제공하며 향후 오픈 소스로 전환될 예정이다.
웹 서버 게이트웨이 인터페이스
개요
종류애플리케이션 프로그래밍 인터페이스
약자WSGI
개발필 존스
발표일2003년 12월 15일
최신 버전1.0.1 (2015년 9월 17일)
상세 정보
유형파이썬 표준
설명파이썬 웹 서버와 웹 애플리케이션 간의 표준 인터페이스
관련 문서
PEP333

2. 역사적 배경

기존의 파이썬 웹 애플리케이션 프레임워크는 웹 서버를 선택하는데 있어서 제약이 있었다. 보통 CGI, FastCGI, mod_python 과 같은 커스텀 API 중에 하나만 사용할 수 있도록 디자인 되었는데, WSGI는 그에 반하여 low-level로 만들어져서 웹 서버와 웹 애플리케이션, 프레임워크 간의 벽을 허물었다.[6]

2003년, 파이썬 웹 프레임워크는 일반적으로 특정 웹 서버의 API에 맞춰 작성되었다. PEP 333에서는 다음과 같이 언급한다.

> 파이썬은 현재 Zope, Quixote, Webware, SkunkWeb, PSO 및 Twisted Web과 같은 다양한 웹 애플리케이션 프레임워크를 자랑한다. 이러한 광범위한 선택은 새로운 파이썬 사용자에게 문제가 될 수 있다. 일반적으로 웹 프레임워크 선택은 사용 가능한 웹 서버 선택을 제한하고 그 반대의 경우도 마찬가지이기 때문이다... 반대로, 자바에는 이만큼 많은 웹 애플리케이션 프레임워크가 있지만 자바의 "서블릿" API를 통해 모든 자바 웹 애플리케이션 프레임워크로 작성된 애플리케이션을 서블릿 API를 지원하는 모든 웹 서버에서 실행할 수 있다.

이러한 문제를 해결하기 위해 WSGI가 고안되었다. WSGI는 Python에서 웹 애플리케이션과 웹 서버를 연결하는 표준 사양을 정하는 것이다. WSGI는 웹 서버와 웹 애플리케이션 또는 프레임워크 간의 구현 중립적인 인터페이스 (컴퓨터 과학)로 생성되어 소프트웨어 이식성 높은 웹 애플리케이션 개발을 위한 공통 기반을 촉진했다.[4] WSGI에 대응하는 웹 애플리케이션(또는 프레임워크)은 WSGI에 대응하는 임의의 웹 서버에서 운용할 수 있게 된다. 즉, 애플리케이션 측이 WSGI에 대응하고 있으면, 애플리케이션 코드에 수정을 가하지 않고 WSGI 대응 서버를 자유롭게 선택할 수 있으며, 높은 이식성 (포터빌리티)을 얻을 수 있다.

3. 상세 사양

WSGI는 서버/게이트웨이 측과 애플리케이션/프레임워크 측, 두 가지 측면으로 구성된다. 서버 측은 환경 정보와 콜백 함수를 애플리케이션 측에 제공하고, 애플리케이션 측은 요청을 처리하여 제공된 콜백 함수를 통해 서버 측에 응답한다.

웹 서버에 요청이 오면 다음과 같은 흐름으로 WSGI가 처리한다.

1. 서버 측이 클라이언트로부터 요청을 받는다.

2. 서버 측은 애플리케이션 측이 엔트리 포인트로 제공하는 호출 가능한 객체(함수나 클래스 인스턴스 등 `__call__`이 정의된 객체)를 호출하여 해당 인수로 환경 변수와 하나의 콜백용 호출 가능 객체를 전달한다.

3. 애플리케이션 측은 이 콜백용 호출 가능 객체를 호출함으로써 상태 코드와 응답 헤더를 서버 측에 전달하고, 더 나아가 본문을 생성하는 반복 가능한 객체(이터레이터나 리스트 등)를 반환값으로 반환한다.

4. 서버 측은 이를 사용하여 클라이언트에 대한 응답을 생성한다.

WSGI 미들웨어는 서버와 애플리케이션 사이에서 요청/응답을 처리하며, 서버의 관점에서는 애플리케이션으로, 애플리케이션의 관점에서는 서버로 행동한다. 미들웨어는 다음과 같은 기능을 수행할 수 있다.


  • 환경 변수가 바뀌면 타겟 URL에 따라서 리퀘스트의 경로를 지정해준다.
  • 같은 프로세스에서 여러 애플리케이션과 프레임워크가 실행되게 한다.
  • XSLT 스타일시트를 적용하는 것과 같이 전처리를 한다.
  • 목표 URL에 따라 환경 변수를 적절히 변경하고 요청을 다른 애플리케이션 객체로 회송한다.
  • 여러 애플리케이션(및 프레임워크)이 동일한 프로세스 내에서 공존하여 작동하도록 한다.
  • 요청과 응답을 네트워크상에서 전송함으로써 부하 분산과 원격 처리
  • 콘텐츠의 후처리 실행 - XSL 스타일시트를 적용하는 등

4. WSGI 미들웨어

WSGI 미들웨어는 서버애플리케이션 사이에서 동작하며, 서버 관점에서는 애플리케이션으로, 애플리케이션 관점에서는 서버로 작동한다. WSGI 미들웨어는 다음과 같은 기능을 수행하는 파이썬 호출 가능 객체이다.


  • 대상 URL에 따라 요청을 다른 애플리케이션 객체로 라우팅하고, 그에 따라 환경 변수를 변경한다.
  • 동일한 프로세스에서 여러 애플리케이션 또는 프레임워크를 병렬로 실행할 수 있도록 허용한다.
  • 로드 밸런싱 및 원격 처리를 위해 네트워크를 통해 요청 및 응답을 전달한다.
  • XSLT 스타일시트 적용과 같은 콘텐츠 후처리를 수행한다.


WSGI 미들웨어는 자체적으로 WSGI 애플리케이션이면서, 다른 WSGI 애플리케이션에 요청 처리를 위임할 수 있다.

5. 애플리케이션 예시

python

def application(environ, start_response):

start_response('200 OK', [('Content-Type', 'text/plain')])

yield b'Hello, World!\n'

```

파이썬으로 작성된 WSGI 호환 "Hello, World!" 애플리케이션 예시는 위와 같다.[8]


  • 1행은 `application` 함수를 정의하며, `environ`과 `start_response` 두 개의 매개변수를 받는다.
  • `environ`은 CGI 환경 변수와 기타 요청 매개변수 및 메타데이터를 포함하는 딕셔너리이다.[9]
  • `start_response`는 호출 가능하며, `status`와 `response_headers` 두 개의 위치 매개변수를 받는다.
  • 2행은 `start_response`를 호출하여 "200 OK"를 HTTP 상태로, "Content-Type"을 응답 헤더로 지정한다.
  • 3행은 함수를 제너레이터로 만든다. 응답 본문은 바이트 문자열의 반복 가능한 객체로 반환된다.


해설:

  • WSGI 애플리케이션은 호출 가능 객체(`__call__`이 정의된 객체)로 정의한다(이 예에서는 `application` 함수).
  • 이 객체가 호출될 때, `environ` 인수로 CGI와 유사한 환경 변수가 전달된다.
  • `start_response` 인수로 상태 코드와 응답 헤더를 받는 호출 가능 객체가 전달된다.
  • `start_response`를 호출하여 상태 코드와 응답 헤더를 설정한다.
  • WSGI 애플리케이션의 반환값은 본문을 생성하는 iterable 객체여야 한다. 이 예에서는 파이썬의 제너레이터 기능을 사용하여 구현한다.

6. 애플리케이션 호출 예시

다음은 WSGI 애플리케이션을 호출하여 HTTP 상태, 응답 헤더, 응답 본문을 파이썬 객체로 검색하는 방법의 개요이다.[10] `environ` 딕셔너리 구성 방법에 대한 세부 정보는 생략되었다.



from io import BytesIO

def call_application(app, environ):

status = None

headers = None

body = BytesIO()

def start_response(rstatus, rheaders):

nonlocal status, headers

status, headers = rstatus, rheaders

app_iter = app(environ, start_response)

try:

for data in app_iter:

assert status is not None and headers is not None, \

"start_response() was not called"

body.write(data)

finally:

if hasattr(app_iter, 'close'):

app_iter.close()

return status, headers, body.getvalue()

environ = {...} # "environ" dict

status, headers, body = call_application(app, environ)


7. WSGI 호환 애플리케이션 및 프레임워크

Django, Flask, Pyramid, CherryPy, Bottle 등 다양한 파이썬 웹 프레임워크가 WSGI를 지원한다. Google App Engine의 webapp2도 WSGI를 지원한다.

WSGI를 지원하는 주요 웹 프레임워크 및 애플리케이션은 다음과 같다.

프레임워크/애플리케이션설명
https://github.com/jonashaag/bjoern bjoern
BlueBream
bobo[11]
Bottle
CherryPy
Django[12]
Eventlet[13]
https://github.com/jamesroberts/fastwsgi FastWSGI
Flask
Falcon (웹 프레임워크) [14]
Gevent-FastCGI[15]
Google App Engine webapp2
Gunicorn
prestans[16]
mod_wsgiApache와 함께 사용[17]
netius
pycnic[18]
Paste WebObWSGI 확장, Pylons 프로젝트 채택
Pylons
Pyramid
restlite[19]
Tornado
Trac
TurboGears
Uliweb[20]
uWSGI
Waitress[21]
web.py[22]
web2py
weblayer[23]
Werkzeug[24]
Radicale[25]


8. WSGI 지원 서버

다수의 웹 프레임워크가 WSGI를 지원한다.


  • [https://github.com/jonashaag/bjoern bjoern]
  • BlueBream
  • bobo[11]
  • Bottle
  • CherryPy
  • Django[12]
  • Eventlet[13]
  • [https://github.com/jamesroberts/fastwsgi FastWSGI]
  • Flask
  • Falcon (웹 프레임워크) [14]
  • Gevent-FastCGI[15]
  • Google App Engine의 webapp2
  • Gunicorn
  • prestans[16]
  • mod_wsgi는 Apache와 함께 사용한다.[17]
  • netius
  • pycnic[18]
  • Paste 구성 요소인 WebOb는 특히 WSGI 확장이며, Pylons 프로젝트에 의해 채택되었다.
  • Pylons
  • Pyramid
  • restlite[19]
  • Tornado
  • Trac
  • TurboGears
  • Uliweb[20]
  • uWSGI
  • Waitress[21]
  • web.py[22]
  • web2py
  • weblayer[23]
  • Werkzeug[24]
  • Radicale[25]


FastCGI, CGI, SCGI, AJP (flup 사용), twisted.web, Apache (mod_wsgi 또는 mod_python 사용), Nginx (ngx_http_uwsgi_module 사용),[26] Nginx Unit (Python 언어 모듈 사용),[27] 및 Microsoft IIS (WFastCGI 사용,[28] isapi-wsgi 사용,[29] PyISAPIe 사용,[30] 또는 ASP 게이트웨이)에 대한 래퍼(wrapper)가 사용 가능하다.

WSGI 서버(WSGI 애플리케이션 컨테이너)는 WSGI 애플리케이션을 상주시키고, HTTP 클라이언트로부터 요청을 받을 때마다 WSGI 애플리케이션의 호출 가능 객체를 호출하여 클라이언트의 요청을 애플리케이션으로 전달한다.

WSGI 애플리케이션 컨테이너의 예로는 uWSGI, Gunicorn, 아파치 모듈 (mod_wsgi, mod_python 등), Microsoft IIS ([https://code.google.com/archive/p/isapi-wsgi isapi-wsgi], [http://pyisapie.sourceforge.net/ PyISAPIe], ASP 게이트웨이 사용) 등이 있다.

WSGI 애플리케이션을 FastCGISCGI 환경에서 동작시키거나, 고전적인 CGI로 동작시킬 수도 있다 (예: Python 표준 라이브러리에 포함된 `wsgiref.handlers.CGIHandler` 사용).

9. 다른 프로그래밍 언어에 대한 영향

WSGI에서 영감을 받아 다른 프로그래밍 언어에도 유사한 인터페이스가 만들어졌다. 다음은 그 예이다.


  • PSGI (Perl Web Server Gateway Interface)
  • Rack (Ruby Web Server Interface)
  • SCGI
  • Ring (Clojure)
  • [https://github.com/fukamachi/clack Clack] (Common Lisp)
  • [https://hackage.haskell.org/package/wai WAI] (Haskell, Web Application Interface)

10. Python 3와 WSGI

Python 3에서 문자열과 바이트열이 분리된 것은 WSGI에 문제를 야기했다. HTTP 헤더 데이터는 텍스트로 처리되거나 바이너리로 처리되지만, WSGI는 헤더 데이터를 문자열로 처리한다. Python 2에서는 텍스트도 바이너리도 "문자열"로 처리했기 때문에 문제가 없었지만, Python 3에서는 바이너리는 bytes형으로 처리하게 되었고, "문자열"은 Unicode 문자열을 의미하게 되었다. 이 문제에 대처한 갱신된 WSGI 사양은 PEP 3333으로 공개되어 있다.

재고된 WSGI 사양으로 Web3라는 것도 제안되었으며, 이는 PEP 444로 공개되어 있다. Web3는 호환되지 않는 WSGI의 파생이며, Python 2.6 이후 및 3.1 이후에서 동작하도록 설계되었다.

참조

[1] 웹사이트 An Introduction to Web Programming with WSGI http://www.phyast.pi[...] 2007-06-11
[2] 논문 Mucking about with microframeworks https://lwn.net/Arti[...] 2019-07-09
[3] 웹사이트 An Introduction to Python WSGI Servers for Performance {{!}} AppDynamics https://www.appdynam[...] 2020-08-20
[4] 웹사이트 PEP 3333 - Python Web Server Gateway Interface v1.0.1 https://www.python.o[...] 2018-04-04
[5] 웹사이트 PEP 333 -- Python Web Server Gateway Interface v1.0 https://www.python.o[...] 2018-04-04
[6] 웹사이트 FrontPage - Python Wiki https://www.python.o[...] 2017-01-27
[7] 웹사이트 PEP 3333 -- Python Web Server Gateway Interface v1.0.1 https://www.python.o[...] 2018-04-04
[8] 문서 i.e. "a function, method, class, or an instance with a __call__ method"
[9] 웹사이트 PEP 3333 -- Python Web Server Gateway Interface v1.0.1 https://www.python.o[...] 2018-04-04
[10] 웹사이트 Creating WSGI Middleware - Alan Christopher Thomas - Minted - PythonKC https://www.youtube.[...] YouTube 2017-01-27
[11] 웹사이트 プエラリアジェルの効果は? http://bobo.digicool[...] 2017-01-27
[12] 웹사이트 Django without mod_python, and WSGI support | Weblog | Django http://www.djangopro[...] 2017-01-27
[13] 웹사이트 wsgi – WSGI server — Eventlet 0.20.1 documentation http://eventlet.net/[...] 2017-01-27
[14] 웹사이트 Falcon - Bare-metal web API framework for Python https://falconframew[...] 2017-10-22
[15] 웹사이트 gevent-fastcgi 1.0.2.1 : Python Package Index https://pypi.python.[...] 2017-01-27
[16] 웹사이트 anomaly/prestans: A WSGI compliant REST micro-framework https://github.com/p[...] 2017-01-27
[17] 웹사이트 Google Code Archive - Long-term storage for Google Code Project Hosting http://code.google.c[...] 2017-01-27
[18] 웹사이트 Pycnic Framework http://pycnic.nullis[...] 2017-01-27
[19] 웹사이트 theintencity/restlite: Light-weight RESTful server tools in Python https://github.com/t[...] 2017-01-27
[20] 웹사이트 limodou/uliweb: Simple and easy use python web framework https://github.com/l[...] 2017-01-27
[21] 웹사이트 waitress documentation https://docs.pylonsp[...] 2018-09-26
[22] 웹사이트 Welcome to http://webpy.org/ 2017-01-27
[23] 웹사이트 weblayer — weblayer v0.4.3 documentation http://packages.pyth[...] 2017-01-27
[24] 웹사이트 Welcome | Werkzeug (The Python WSGI Utility Library) http://werkzeug.poco[...] 2017-01-27
[25] 웹사이트 CalDAV and CardDAV Server - A Simple Calendar and Contact Server http://radicale.org/ 2017-01-27
[26] 웹사이트 Module ngx_http_uwsgi_module http://nginx.org/en/[...] 2017-01-27
[27] 웹사이트 Configuration — NGINX Unit https://unit.nginx.o[...] 2023-05-04
[28] 웹사이트 Python Tools for Visual Studio - Documentation http://pytools.codep[...] 2017-01-27
[29] 웹사이트 Google Code Archive - Long-term storage for Google Code Project Hosting http://code.google.c[...] 2017-01-27
[30] 웹사이트 Python ISAPI Extension for IIS download | SourceForge.net http://pyisapie.sour[...] 2017-01-27
[31] 웹사이트 An Introduction to Web Programming with WSGI http://www.phyast.pi[...] 2007-11
[32] 논문 Mucking about with microframeworks https://lwn.net/Arti[...] 2019-09
[33] 웹인용 PEP 333 -- Python Web Server Gateway Interface v1.0 https://www.python.o[...] 2018-04-04



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com