버전 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()
필요한 경우 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