본문 바로가기

WSGI, Gunicorn

WSGI란 무엇인가?

WSGI(Web Server Gateway Interface)는 Python 웹 애플리케이션과 웹 서버 간의 표준 인터페이스입니다. Python 웹 애플리케이션을 다양한 웹 서버에서 실행할 수 있도록 정의된 프로토콜로, Python 언어에만 적용되는 표준입니다.


WSGI의 주요 역할

  1. 서버와 애플리케이션 간의 인터페이스:
    • WSGI는 Python 웹 애플리케이션과 웹 서버 간의 통신 규칙을 정의합니다.
    • 이를 통해 개발자는 특정 웹 서버(Gunicorn, uWSGI 등)에 종속되지 않고, 애플리케이션을 쉽게 배포할 수 있습니다.
  2. 호환성 보장:
    • WSGI를 사용하면 다양한 웹 서버와 Python 웹 프레임워크(Flask, Django 등)를 연결할 수 있습니다.
    • 예를 들어, Flask 앱은 WSGI를 통해 Gunicorn이나 uWSGI와 통신 가능.

WSGI의 동작 원리

WSGI는 다음 두 가지 역할을 명확히 정의합니다:

  1. WSGI 서버:
    • 클라이언트 요청을 받고, 이를 WSGI 애플리케이션에 전달.
    • 예: Gunicorn, uWSGI, mod_wsgi(Apache 모듈).
  2. WSGI 애플리케이션:
    • 요청을 처리하고 응답을 생성.
    • 예: Flask, Django, 또는 사용자 정의 Python 애플리케이션.

WSGI 서버와 애플리케이션의 통신 방식:

  • WSGI 애플리케이션은 callable object(보통 함수)를 정의하며, WSGI 서버는 이를 호출합니다.
  • 기본 구조:
  • python
    코드 복사
    def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello, WSGI!"]
  • environ: 요청 정보를 담고 있는 딕셔너리.
  • start_response: 상태 코드와 헤더를 설정하는 함수.

WSGI의 장점

  1. 프레임워크와 서버 간 호환성 보장:
    • Flask, Django, FastAPI 같은 프레임워크는 WSGI를 따르므로 Gunicorn, uWSGI와 같은 다양한 서버에서 실행 가능.
  2. 단순함:
    • HTTP 요청과 응답 처리를 위한 최소한의 인터페이스 제공.
  3. 확장성:
    • 단일 스레드, 멀티스레드, 멀티프로세스 등 다양한 실행 방식 지원.

Python에만 해당되는 표준인가?

네, WSGI는 Python 웹 애플리케이션을 위한 표준 인터페이스로 Python 생태계에서만 사용됩니다. 다른 언어에서는 각각의 표준 인터페이스나 방식이 존재합니다.

다른 언어의 유사한 표준:

  1. Java:
    • Servlet API: Java 웹 애플리케이션과 웹 서버 간의 표준 인터페이스.
    • Tomcat, Jetty 같은 Java 서버가 이를 지원.
  2. Ruby:
    • Rack: Ruby 웹 애플리케이션과 서버 간의 표준 인터페이스.
    • Puma, Unicorn 같은 서버와 호환.
  3. Node.js:
    • Node.js는 HTTP 모듈을 통해 자체적으로 서버를 생성하므로 별도의 표준 인터페이스가 필요하지 않음.
  4. PHP:
    • PHP는 보통 Apache, Nginx와 연동되어 동작하며, FastCGI 같은 표준을 사용.

WSGI의 한계

  1. 비동기 지원 부족:
    • WSGI는 설계 당시 비동기를 고려하지 않았기 때문에, 비동기 프로그래밍이 중요해진 현대에는 제한이 있음.
    • 비동기 처리가 필요한 경우, ASGI(Asynchronous Server Gateway Interface)를 사용해야 함.
  2. 고정된 동작 방식:
    • HTTP/2, WebSocket 같은 최신 기술 지원이 부족.

WSGI vs ASGI

  • WSGI:
    • 동기 기반.
    • HTTP 요청/응답 처리에 최적화.
    • Django, Flask와 같은 전통적인 프레임워크에서 사용.
  • ASGI:
    • 비동기 및 동기 모두 지원.
    • WebSocket, HTTP/2 같은 최신 기술 지원.
    • FastAPI, Django Channels와 같은 비동기 프레임워크에서 사용.

정리

  • WSGI는 Python 웹 애플리케이션과 웹 서버 간 통신을 위한 표준.
  • Python 생태계에만 적용되며, 다른 언어에는 각자의 표준이 있음.
  • 비동기 기술이 중요해짐에 따라, ASGI로 점차 대체되는 추세.

 

Gunicorn은 "Green Unicorn"의 약자로, Python WSGI(Web Server Gateway Interface) 서버입니다. Python 웹 애플리케이션(Flask, Django 등)을 실행하기 위해 사용되는 고성능 HTTP 서버로, 애플리케이션과 실제 웹 서버(Nginx, Apache 등) 사이에서 중간 역할을 합니다.

 

Gunicorn의 주요 역할

  1. WSGI 표준 준수:
    • Python 웹 프레임워크들은 WSGI라는 표준 인터페이스를 통해 웹 서버와 통신합니다. Gunicorn은 WSGI 서버로서 이러한 요청을 처리합니다.
  2. 멀티프로세스 지원:
    • Gunicorn은 다중 프로세스를 사용하여 여러 요청을 병렬로 처리할 수 있습니다. 이는 애플리케이션의 성능과 안정성을 향상시킵니다.
  3. 쉬운 확장성:
    • 작업자(worker) 수를 조정하여 서버의 동시 요청 처리 능력을 조절할 수 있습니다.
  4. 웹 서버 통합:
    • Gunicorn은 자체적으로 클라이언트 요청을 받을 수 있지만, 보통 Nginx 같은 프런트엔드 리버스 프록시 서버와 함께 사용됩니다. Nginx는 정적 파일 제공과 같은 작업을 처리하고, 동적 요청만 Gunicorn으로 전달합니다.

Gunicorn의 장점

  • 간단한 설정: 설정이 비교적 간단하며, 기본값으로도 많은 사용 사례에 적합합니다.
  • 프레임워크 독립성: WSGI를 지원하는 모든 Python 프레임워크에서 사용 가능합니다.
  • 안정성: 고성능, 안정적인 운영이 가능합니다.

Gunicorn을 사용하는 이유

Python 자체의 내장 서버(예: Flask의 app.run() 또는 Django의 runserver)는 개발 환경에서만 사용하기에 적합하며, 실제 운영 환경에서는 성능과 안정성에서 부족합니다. Gunicorn은 이를 보완하여 프로덕션 환경에서도 안정적으로 애플리케이션을 운영할 수 있도록 합니다.

언어 Python
기반 기술 WSGI (Python 웹 표준 인터페이스)
사용 대상 Flask, Django 같은 Python 웹 프레임워크
설치 및 실행 간단 (pip install gunicorn)
역할 WSGI 서버로 Python 앱 실행
멀티프로세스/스레드 멀티 프로세스 기반
확장성 작업자 수(worker)를 조정하여 요청 처리량 확장 가능

'정글' 카테고리의 다른 글

UDP  (0) 2024.12.19
TCP  (0) 2024.12.19
OpenSSL와 자체 서명 인증서  (0) 2024.12.18
Nginx  (1) 2024.12.18
PINTOS 4주차 Stack Growth  (0) 2024.10.22