nginx - Uvicorn 没有随机处理一些请求
问题描述
我们正在运行一个 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 套接字而不是代理服务器
解决方案
推荐阅读
- django - 弹性搜索查询
- python - python,循环:搜索列表以查看项目是否存在,附加到新列表
- java - 从 Java 7 的 Files.createTempFile 限制文件名的长度
- python - 使用 Holoviews 在同一轴上绘制两组数据
- matrix-multiplication - 在将 2 个矩阵相乘时,使用以下算法:for i=1 to n,for j=1 to p,Cij=0,for k=1 to n,Cij=
- hybris - 如何根据用户组隐藏后台导航节点?
- xml - 如何使用 XSLT 删除 xml 命名空间别名
- javascript - 如何在jexcel中动态创建空白行
- javascript - 使用字符串作为参数来控制函数结果是一种反模式吗?
- sql - 在 PostgreSQL 中跨多个表索引列