開門見山的說
最近一個項目使用了django3.0,那么沒有道理不用一下asgi異步特性來玩一玩,部署的時候花費了一些力氣,故留個筆記
uvicorn的使用
uvicorn采用了uvloop 用Cython改寫了python里面asyncio的時間循環, 將asyncio的效率提高了4倍以上
安裝
pip3 install uvicorn
本地跑一下項目試一試
uvicorn myproject.asgi:application
此時出現
表示項目正常運行
其它的參數請參照文檔:
https://www.uvicorn.org/settings/
進程管理
用uvicorn部署了之后, 極高的提升了性能 但是在進程管理上就很麻煩
首先生產版本沒有提供一個快速重啟的接口 也沒有優雅結束的功能
如果要結束服務,(特別是服務通過nohup等命令后台運行之后) 只能通過 ps -ef | grep uvicorn 查到進程id 然后通過 kill -9 process_id 殺死進程
那么supervisor就應運而生了. 這是一個進程管理系統, 可以把uvicorn運行成為它的子進程 從而進行管理
安裝
yum install supervisor
測試是否安裝成功
echo_supervisord_conf
然后會在/etc/supervisord.conf生成一個配置文件. 配置文件里曼有一行
[include]
files = supervisord.d/*.ini
也就是說在/etc/supervisord.d/里面的ini文件都會被包含進去
為了方便管理, 每一個應用最好都創建一個ini文件 放在/etc/supervisord.d/里面
vim /etc/supervisord.d/userSystem.ini
[fcgi-program:uvicorn]
socket=tcp://localhost:8000
directory=/usr/python_test/userSystem/
command=uvicorn --fd 0 userSystem.asgi:application
numprocs=4
process_name=uvicorn-%(process_num)d
stdout_logfile=/home/log/test.log
stdout_logfile_maxbytes=20MB
socket為對外暴露的接口 可以是unix 也可以是一個網絡端口 端口的形式可以見官方文檔
command為執行命令
directory為項目路徑
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
當出現以下提示時 代表已經啟動完成
nginx反向代理
直接上配置文件把
server {
listen 80;
server_name localhost
charset UTF-8;
access_log /home/log/test_nginx_access.log;
error_log /home/log/test_nginx_error.log;
client_max_body_size 75M;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
然后重啟nginx就完事了
nginx -s reload
結束
按照以上的步驟,能夠部署號一個django3.0項目,性能高效,方便管理
假如出現錯誤
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: <string> line: 1
后面找了很久,終於找到了解決問題的方法。執行前,請先確認supervisord.conf配置文件所在路徑:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf