由于需要用到channel,最近在研究通过asgi部署django。
先吐槽一下官方文档,这个地方讲的非常简单。然后中文互联网环境能找到的都是3.0试用的说明,这玩意是不是真的没人用啊?还是说Django已经脱离时代了。。。
简单研究了一下,发现uwsgi 应该就是相当于 supervisord + daphne + asgi 三个东西的合体。不得不说,异步以后真的复杂度直线提升,对于我们这种写玩具的系统人来说真的头秃。
我就不再赘述asgi和daphne在django中的设置了,这个还是比较简单,到处都能找到代码。我这里就说说nginx和supervisord这两个东西应该怎么配置。
Daphne 其实没
supervisord
supervisord有两种方式,一种是直接在python里面装,一种是用apt-get装。我觉得对于环境来说还是要用apt装。
配置主要看招手熊大佬的文章:(话说大佬这个代码块为啥是蓝色的,好看得多。)
https://blog.csdn.net/dorlolo/article/details/119336687
1.备份默认的配置文件
cp /etc/supervisor/supervisord.conf /etc/supervisor/supervisord.conf_bak
2.重新生成配置文件
echo_supervisord_conf > supervisord.conf
3.vim编辑器打开配置文件
vim /etc/supervisor/supervisord.conf
参考招手熊大佬我也都换成/var/run/,原因是使用默认的/tmp目录经常有权限的问题。
[unix_http_server]
file=/var/run/supervisor.sock
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
silent=false
minfds=1024
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[include]
files = /etc/supervisor/conf.d/*.conf
在/etc/supervisor/conf.d目录下面新建一个项目名称.conf
[fcgi-program:项目名称]
socket=tcp://0.0.0.0:11000
# 原本是测试使用虚拟环境,但是设置起来很奇怪不方便使用,项目比较赶,所以最后还是直接用了系统的python
# environment=PATH="/home/cbirc/django/ythxt/ythxt_api/venv_ubuntu/bin"
# 项目文件所在目录
directory=项目文件所在目录
# 每个进程需要有一个单独的socket文件,所以我们使用process_num
# 确保更新“mysite.asgi”以匹配您的项目名称
command=python3 -m daphne -u 项目路径/%(process_num)d.sock --fd 0 --access-log - --proxy-headers 项目名称.asgi:application
# 要启动的进程数,大致为您拥有的 CPU 数
numprocs=4
# 给每个进程一个唯一的名称,以便它们可以被区分
process_name=asgi%(process_num)d
# 自动启动和恢复进程
autostart=true
autorestart=true
# 选择您希望日志存放的位置
stdout_logfile=日志目录/logs/asgi.log
redirect_stderr=true
然后就可以执行启动
sudo supervisord
后续通过supervisorctl
查看进程运行情况
1.查看进程状态
sudo supervisorctl status
2.启动进程
sudo supervisorctl start 项目名称:*
3.停止进程
sudo supervisorctl stop 项目名称:*
4.重启进程
sudo supervisorctl restart 项目名称:*
5.停止所有进程
sudo supervisorctl stop all
6.更新配置后必须执行更新命令才生效
sudo supervisorctl update
7.重启supervisord,这个比较奇怪,好像update之后就会自动重启进程了,所以这个我没用过
sudo supervisorctl reload
8.关闭supervisord
sudo supervisorctl shutdown
nginx
nginx 就直接加一个pass 到对应的端口,配置也比uwsgi复杂很多。
location /api {
proxy_pass http://127.0.0.1:11000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
目前就是粗浅的搭起来先测试,后续有啥问题,我再来补充。