7

我们正在运行一个 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>

  1. 改变工人数量,工人超时
  2. 将进程管理器从 gunicorn 更改为 supervisord
  3. 将 CPU 密集型任务卸载到 Celery 而不是线程
  4. 将 uvicorn 应用程序绑定到 unix 套接字而不是代理服务器
4

0 回答 0