生产环境部署 FastAPI + Nginx + Systemd 服务

文章目录

    测试开发环境

    uvicorn server:app --reload
    

    但是生产环境需要配置的项目要更多,例如:

    • 指定端口号
    • 如何利用多核。python 的历史问题
    • nginx 配置
    • systemd 配置

    uvicorn 是什么

    Uvicorn is a lightning-fast ASGI server implementation, using uvloop and httptools.

    与 Gunicorn 一同使用

    参考 uvicorn 及 FastAPI 的官方文档:

    • https://www.uvicorn.org/#running-with-gunicorn
    • https://fastapi.tiangolo.com/deployment/server-workers/

    都建议在生产环境配合 Gunicorn 一起使用。原因是:

    • 方便的管理 work 进程数。主要是为了充分利用服务器的多核;虽然 unicorn 也能指定 work 数,但是不监控进程的状态,所以就不能保活?
    • work 进程可以平滑重启
    • 升级无需宕机

    示例:

    gunicorn server:app -w 4 -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:9012
    

    安装 gunicorn

    pip install "uvicorn[standard]" gunicorn
    

    配置 systemd

    如果只单纯运行 gunicorn,会发现其没有自动进入后台运行

    > gunicorn server:app -w 4 -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:9012
    [2022-02-24 22:16:04 +0800] [1133099] [INFO] Starting gunicorn 20.1.0
    [2022-02-24 22:16:04 +0800] [1133099] [INFO] Listening at: http://127.0.0.1:9012 (1133099)
    [2022-02-24 22:16:04 +0800] [1133099] [INFO] Using worker: uvicorn.workers.UvicornWorker
    [2022-02-24 22:16:04 +0800] [1133101] [INFO] Booting worker with pid: 1133101
    [2022-02-24 22:16:04 +0800] [1133102] [INFO] Booting worker with pid: 1133102
    [2022-02-24 22:16:04 +0800] [1133103] [INFO] Booting worker with pid: 1133103
    [2022-02-24 22:16:04 +0800] [1133104] [INFO] Booting worker with pid: 1133104
    [2022-02-24 22:16:06 +0800] [1133101] [INFO] Started server process [1133101]
    [2022-02-24 22:16:06 +0800] [1133101] [INFO] Waiting for application startup.
    [2022-02-24 22:16:06 +0800] [1133101] [INFO] Application startup complete.
    [2022-02-24 22:16:06 +0800] [1133102] [INFO] Started server process [1133102]
    [2022-02-24 22:16:06 +0800] [1133102] [INFO] Waiting for application startup.
    [2022-02-24 22:16:06 +0800] [1133102] [INFO] Application startup complete.
    [2022-02-24 22:16:06 +0800] [1133103] [INFO] Started server process [1133103]
    [2022-02-24 22:16:06 +0800] [1133103] [INFO] Waiting for application startup.
    [2022-02-24 22:16:06 +0800] [1133103] [INFO] Application startup complete.
    [2022-02-24 22:16:06 +0800] [1133104] [INFO] Started server process [1133104]
    [2022-02-24 22:16:06 +0800] [1133104] [INFO] Waiting for application startup.
    [2022-02-24 22:16:06 +0800] [1133104] [INFO] Application startup complete.
    
    ^C[2022-02-24 22:16:12 +0800] [1133099] [INFO] Handling signal: int
    [2022-02-24 22:16:12 +0800] [1133099] [WARNING] Worker with pid 1133101 was terminated due to signal 3
    [2022-02-24 22:16:12 +0800] [1133099] [WARNING] Worker with pid 1133104 was terminated due to signal 3
    [2022-02-24 22:16:12 +0800] [1133099] [WARNING] Worker with pid 1133102 was terminated due to signal 3
    [2022-02-24 22:16:12 +0800] [1133099] [WARNING] Worker with pid 1133103 was terminated due to signal 3
    [2022-02-24 22:16:12 +0800] [1133099] [INFO] Shutting down: Master
    

    将之前的 golang 服务的 systemd 配置文件复制一份,修改一下 gunicorn 的路径即可。

    $ which gunicorn
    /home/username/.local/bin/gunicorn
    
    sudo systemctl enable some.service
    sudo systemctl start some.service
    sudo systemctl status some.service
    

    部署还是太麻烦

    python 的线上部署,不但比不过 golang,连 php 都不如。
    概念多,流程复杂,对新手很不友好。而且性能还拿不出手,悲剧。

    TODO

    • done: git 拉取代码
    • done: 安装 uvicorn, gunicorn
    • done: 测试能否运行起来。uvicorn server:app –reload
    • done: 整理各服务的端口占用情况,存在根目录的文件中,方便给新服务分配端口
    • nginx 配置:端口及 static 目录
    • systemd 配置

    ImportError: libGL.so.1

    运行

    uvicorn server:app --reload
    

    报错:

    ImportError: libGL.so.1: cannot open shared object file: No such file or directory

    解决方法:

    sudo apt update
    sudo apt install libgl1
    

    参考

    • https://dev.to/shuv1824/deploy-fastapi-application-on-ubuntu-with-nginx-gunicorn-and-uvicorn-3mbl
    • https://blog.nawaz.info/deploy-fastapi-application-on-ubuntu-with-nginx-gunicorn-and-uvicorn

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式