Gunicorn
·
Gunicorn - web сервер для python приложений, как правило, используется в связки с django. У него WSGI интерфейс, поэтому с asyncio не работает (работает через uvicorn воркер). Сейчас в статусе unmaintained, но security патчи завозят. Хорош тем, что просто как пробка.
Типовая конфигурация:
import psycogreen.gevent
# https://github.com/psycopg/psycogreen/blob/39a258cb4040b88b60a7600f6942e651a28db9a7/README.rst#module-psycogreengevent
psycogreen.gevent.patch_psycopg()
import os
import multiprocessing
default_worker_count = multiprocessing.cpu_count() * 2 + 1
# https://docs.gunicorn.org/en/stable/settings.html
backlog = int(os.getenv("GUNICORN_BACKLOG", "2048"))
workers = int(os.getenv("GUNICORN_WORKERS", default_worker_count))
worker_class = os.getenv("GUNICORN_WORKER_CLASS", "gevent")
worker_connections = int(os.getenv("GUNICORN_WORKER_CONNECTIONS", "50"))
timeout = int(os.getenv("GUNICORN_TIMEOUT", "300"))
keepalive = int(os.getenv("GUNICORN_KEEPALIVE", "2"))
threads = int(os.getenv("GUNICORN_THREADS", "1"))
max_requests = int(os.getenv("GUNICORN_MAX_REQUESTS", "2000"))
max_requests_jitter = int(os.getenv("GUNICORN_MAX_REQUESTS_JITTER", "1000"))
graceful_timeout = int(os.getenv("GUNICORN_GRACEFUL_TIMEOUT", "30"))
errorlog = "-"
loglevel = os.getenv("GUNICORN_LOG_LEVEL", "info")
accesslog = "-"
access_log_format = (
f'message'
)
Что точно стоит ставить:
- accesslog в
-
, чтобы шли в stdout - max_requests - чтобы был перезапуск гуникорн от утечек памяти