zoukankan      html  css  js  c++  java
  • 使用supervisor+uvicorn+nginx部署asgi应用

    需求分析:

    需要在linux服务器上部署一个asgi应用(例如 Quart 一个类flask的异步网络框架)

    1.直接运行

    # main.py
    
    from quart import Quart
    
    app = Quart(__name__)
    
    app.run(host='0.0.0.0', port=8080)

    以上是一个简单的quart应用

    可以直接在命令行通过

    python3 main.py

    直接运行 以启动服务

    当然这种是肯定不行的 从小时候妈妈就教育我们 不要在生产环境直接运行python main.py

    因此我们的第一个需求就出现了. 需要一个asgi网关接口(他是wsgi的扩展 支持websocket) ( Python Web Server Gateway Interface,WSGI)

    2.采用uvicorn部署asgi应用

     

     常用的asgi有Daphne Hypercorn 以及下文介绍的uvicorn. 

    uvicorn采用了uvloop 用Cython改写了python里面asyncio的时间循环, 将asyncio的效率提高了4倍以上

    不幸的是, uvicorn只可以运行在linux系统上.

    部署指令也很简单

    pip3 install uvicorn
    
    
    
    
    uvicorn --host 0.0.0.0 --port 8080 main:app

    其他设置参数详见

    https://www.uvicorn.org/settings/

    3.进程管理(pm2)

    https://blog.csdn.net/qq_36938617/article/details/95679412

    npm install pm2 -g
    // x.json

    {
    "name": "wxgzh", "cwd": "/root/Envs/wx/gzh", "script": "/root/Envs/wx/bin/uvicorn --uds wx.sock main:app.asgi", "log_date_format": "YYYY-MM-DD HH:mm:ss Z", "error_file": "error.log", "out_file": "access.log", "cron_restart": "0 4 * * *", "pid_file": "wx.pid", "watch": false, "autorestart": true, }
    pm2 start x.json

    3.进程管理

    用uvicorn部署了之后, 极高的提升了性能 但是在进程管理上就很麻烦

    首先生产版本没有提供一个快速重启的接口 也没有优雅结束的功能

    如果要结束服务,(特别是服务通过nohup等命令后台运行之后) 只能通过 ps -ef | grep uvicorn 查到进程id  然后通过 kill -9 process_id 杀死进程

    那么supervisor就应运而生了. 这是一个进程管理系统, 可以把uvicorn运行成为它的子进程 从而进行管理

    安装方法

    yum install supervisor
    
    # centOS7

    测试是否安装成功

    #测试是否安装成功
    echo_supervisord_conf

    然后会在/etc/supervisord.conf生成一个配置文件. 配置文件里曼有一行

    [include]
    files = supervisord.d/*.ini

    也就是说在/etc/supervisord.d/里面的ini文件都会被包含进去

    为了方便管理, 每一个应用最好都创建一个ini文件 放在/etc/supervisord.d/里面

    vim /etc/supervisord.d/app1.ini
    
    
    [fcgi-program:uvicorn]
    socket=unix:///root/Envs/wx/gzh/wx.sock
    command=/root/Envs/wx/bin/uvicorn --fd 0 main:app.asgi
    numprocs=4
    directory=/root/Envs/wx/gzh
    process_name=uvicorn-%(process_num)d
    stdout_logfile=/root/Envs/wx/gzh/out.log
    stdout_logfile_maxbytes=0

    socket为对外暴露的接口 可以是unix 也可以是一个网络端口 端口的形式可以见官方文档

    command为执行命令.  这里我是在虚拟环境里面运行的, 所以用的是 /root/Envs/wx/bin/uvicorn

    这里有一个坑. 就是后面的app内容(即本例中的 main:app.asgi) 不可以用绝对路径. (踩坑踩了好久) 需要在下面配置 directory 然后用相对路径的方式 写出app的为止

    这里app是我的一个类. 在这个类里面暴露了asgi  所以采用的写法是 main:app.asgi

    numprocs是处理器个数

    process_name是处理进程的名称

    保存之后 用这个命令启动

    supervisorctl update   #一定要先更新
    
    supervisorctl start uvicorn:*
    
    supervisorctl stop uvicorn:*
    
    supervisorctl restart uvicorn:*

    :*的作用是所有进程,. 其所有命令为:

    start <name>            Start a process
    start <gname>:*         Start all processes in a group
    start <name> <name>     Start multiple processes or groups
    start all               Start all processes

    当出现以下提示时 代表已经启动完成

    4.nginx反代

    nginx反代有很多文章介绍了 这里就不赘述了. 直接proxy到刚才在supervisord里面暴露的sock即可.

    server {
        listen 80;
        server_name wx.domain.com;
    
        location / {
            proxy_pass http://unix:/root/Envs/wx/gzh/wx.sock;
        }
    }

    然后重新nginx就可以了

    nginx -s reload

    按照以上步骤, 通过uvicorn+supervisord+nginx完全部署好了一个asgi应用. 性能高效 方便管理.

  • 相关阅读:
    java面向对象小总结
    eclipce 快捷键
    linux中查找和过滤的用法:find,grep
    shell脚本
    条形码和二维码
    Json简介
    牛客练习
    输入流操作
    Java编码
    maven入门
  • 原文地址:https://www.cnblogs.com/btxlc/p/12627500.html
Copyright © 2011-2022 走看看