Django3.0+supervisor+uvicorn+nginx進行線上部署


開門見山的說

最近一個項目使用了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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM