使用supervisor+uvicorn+nginx部署asgi應用

需求分析: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應用. 性能高效 方便管理.

相關文章
相關標籤/搜索