gunicorn - 커스텀 어플리케이션

hwisaac·2023년 9월 6일
0

gunicorn

목록 보기
7/8

커스텀 애플리케이션

버전 19.0에서 새로 추가되었습니다.

때로는 Gunicorn을 WSGI 애플리케이션과 통합하고 싶을 때가 있습니다. 이 경우에는 gunicorn.app.base.BaseApplication을 상속할 수 있습니다.

다음은 매우 간단한 WSGI 앱을 생성하고 사용자 정의 애플리케이션으로 로드하는 예제입니다.

import multiprocessing
import gunicorn.app.base

def number_of_workers():
    return (multiprocessing.cpu_count() * 2) + 1

def handler_app(environ, start_response):
    response_body = b'Works fine'
    status = '200 OK'

    response_headers = [
        ('Content-Type', 'text/plain'),
    ]

    start_response(status, response_headers)

    return [response_body]

class StandaloneApplication(gunicorn.app.base.BaseApplication):

    def __init__(self, app, options=None):
        self.options = options or {}
        self.application = app
        super().__init__()

    def load_config(self):
        config = {key: value for key, value in self.options.items()
                  if key in self.cfg.settings and value is not None}
        for key, value in config.items():
            self.cfg.set(key.lower(), value)

    def load(self):
        return self.application

if __name__ == '__main__':
    options = {
        'bind': '%s:%s' % ('127.0.0.1', '8080'),
        'workers': number_of_workers(),
    }
    StandaloneApplication(handler_app, options).run()

기존 WSGI 앱 직접 사용

필요한 경우 Gunicorn을 Python에서 직접 실행하여 런타임에 WSGI 호환 애플리케이션을 지정할 수 있습니다. 이는 롤링 배포 또는 PEX 파일을 사용하여 애플리케이션을 배포하는 경우 유용할 수 있으며, 앱과 Gunicorn을 동일한 PEX 파일에 번들로 포함할 수 있습니다. Gunicorn은 이러한 기능을 내장하고 있으며 gunicorn.app.wsgiapp이라는 이름으로 알려진 첫 번째 클래스 시민으로 사용됩니다. 이를 사용하여 Flask 또는 Django에서 생성된 것과 같은 WSGI 호환 앱 인스턴스를 실행할 수 있습니다. WSGI API 패키지가 exampleapi이고 애플리케이션 인스턴스가 app이라고 가정하면 다음과 같이 진행할 수 있습니다.

gunicorn.app.wsgiapp exampleapi:app

이 명령은 Gunicorn CLI 매개변수 또는 구성 파일과 함께 작동합니다. 그냥 Gunicorn에 직접 제공하는 것처럼 그대로 전달하면 됩니다.

# 사용자 정의 매개변수
$ python gunicorn.app.wsgiapp exampleapi:app --bind=0.0.0.0:8081 --workers=4
# 구성 파일 사용
$ python gunicorn.app.wsgiapp exampleapi:app -c config.py

PEX를 사용하는 경우 빌드 시에 -c gunicorn을 사용하여 컴파일된 앱에 런타임에서 전달되는 엔트리 포인트를 사용하면 됩니다.

# 일반적인 PEX 빌드 명령 (exampleapi 프로젝트 루트에서 bash를 통해 실행)
$ pex . -v -c gunicorn -o compiledapp.pex
# 실행
./compiledapp.pex exampleapi:app -c gunicorn_config.py

0개의 댓글