需求分析:python
须要在linux服务器上部署一个asgi应用(例如 Quart 一个类flask的异步网络框架)linux
1.直接运行nginx
# main.py from quart import Quart app = Quart(__name__) app.run(host='0.0.0.0', port=8080)
以上是一个简单的quart应用web
能够直接在命令行经过npm
python3 main.py
直接运行 以启动服务json
固然这种是确定不行的 从小时候妈妈就教育咱们 不要在生产环境直接运行python main.pyflask
所以咱们的第一个需求就出现了. 须要一个asgi网关接口(他是wsgi的扩展 支持websocket) ( Python Web Server Gateway Interface,WSGI)vim
2.采用uvicorn部署asgi应用服务器
经常使用的asgi有Daphne Hypercorn 以及下文介绍的uvicorn. websocket
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)
http://www.javashuo.com/article/p-emixyufz-kw.html
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应用. 性能高效 方便管理.