$ ls ~yifei/notes/

FastAPI 部署

Posted on:

Last modified:

安装 uvicorn[standard], 其中包含了 uvloop,性能更好一点。推荐使用 gunicorn + uvicorn worker 的方式运行。

pip install uvicorn[standard]
pip install gunicorn[setproctitle]

单独使用 uvicorn

在开发阶段可以单独使用 uvicorn 来做开发服务器,不需要使用 gunicorn。

uvicorn app:app \
  --host 127.0.0.0 \
  --port 3000 \
  --reload \  # 自动重新加载
  --reload-dir src \  # 重新加载监控的文件夹
  --reload-delay 1 \  # 重新加载时间是 1s

使用 gunicorn+uvicorn

uvicorn 虽然自带了 --workers 选项,但是并没有提供重新拉起进程等监控功能,所以还是建议 使用 gunicorn。

gunicorn 推荐的 worker 数量是系统的 cpu * 2 + 1,不过如果在 docker 或者 k8s 环境中,就要 适当调整了。

gunicorn app:app \
  -b 127.0.0.1:3000 \  # bind 选项同时指定了监听的地址和端口
  -n my_app \
  -w 4 \
  -k uvicorn.workers.UvicornWorker

nginx 配置

server {
    listen 80;
    server_name example.org;
    access_log  /var/log/nginx/example.log;

    location /api {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

问题

uvicorn 使用 CPU 过高的情况

  1. https://github.com/encode/uvicorn/issues/452

参考

  1. https://www.uvicorn.org/deployment/
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站