我们正在运行一个 Fastapi + Uvicorn Web 应用程序,使用 gunicorn 作为进程管理器,使用 Nginx 作为反向代理服务器。对于大多数 i/o 操作(数据库调用、Rest api),应用程序以异步模式运行。整个设置在 Ubuntu 16.04 上的 Docker 容器中运行。
该设置在大多数情况下都有效,但有时它根本不处理请求,并且在 Nginx 端超时。我们还尝试将 Nginx 排除在设置之外,并观察到在很长一段时间后(比如 15 分钟后)很少有请求得到处理。这是非常随机的,但通常在一小时内发生 2-3 次。
下面是我们正在使用的 gunicorn 配置 –</p>
host = os.getenv("HOST", "0.0.0.0")
port = os.getenv("PORT", "80")
# Gunicorn config variables
workers = web_concurrency
bind = f"{host}:{port}"
keepalive = 2
timeout = 60
graceful_timeout = 30
threads = 2
worker_tmp_dir = "/dev/shm"
# Logging mechanism
capture_output = True
loglevel = os.getenv("LOG_LEVEL", "debug")
并使用命令调用 gunicornexec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"
我们已经尝试了一些配置更改,例如 –</p>
- 改变工人数量,工人超时
- 将进程管理器从 gunicorn 更改为 supervisord
- 将 CPU 密集型任务卸载到 Celery 而不是线程
- 将 uvicorn 应用程序绑定到 unix 套接字而不是代理服务器