Django从 3.0版开始加入对ASGI的支持,使Django开始具有异步功能。
截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。
所以说,我们也需要适时的更新我们的技能,学会在asgi异步服务器环境中部署django项目!
在部署之前我们所有的依赖均隔离在python的虚拟环境中,并不是在全局环境中,包括supervisor也是通过pip命令安装到虚拟环境中使用,并不使用 ubuntu的 sudo apt install命令安装在全局环境中,这是需要注意的一点!
在部署之前一定要先激活虚拟环境!
# ubuntu激活虚拟环境
source venv/bin/activate
项目依赖安装,根据各自的项目安装,一般标准的项目依赖均收集在项目根目录的requirements.txt文件中!
Daphne 是一个纯 Python 的 ASGI 服务器,由 Django 项目的成员维护。它充当了 ASGI 的参考服务器。
你可以使用pip
安装 Daphne:
pip install daphne
终端启动命令
daphne -b 0.0.0.0 -p 8000 baykeproject.asgi:application
运行该命令后它将开启一个进程,监听 0.0.0.0:8000
。这需要你的项目位于 Python path 上。为了确保这点,你应该在与 manage.py
文件相同的路径中运行这个命令。
但我们总不能每次部署都需要再终端去使用这个命令吧,所以接下来就需要用到一个进程管理工具supervisor来托管该进程!
在此之前,我们需要先在项目根目录中的deploy目录下新建一个asgi的文件夹,并将daphne的ini配置文件放在该目录下以备后续使用!
[fcgi-program:asgi]
# TCP socket used by Nginx backend upstream
# Nginx 后端上游使用的 TCP 套接字
socket=tcp://localhost:8000
# Directory where your site's project files are located
# 站点项目文件所在的目录
directory=/home/qbc/web/code
# Each process needs to have a separate socket file, so we use process_num
# 每个进程都需要有一个单独的socket文件,所以我们使用process_num
# Make sure to update "mysite.asgi" to match your project name
# 确保更新 “mysite.asgi” 以匹配您的项目名称
command=daphne -u /home/qbc/web/deploy/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers baykeproject.asgi:application
# Number of processes to startup, roughly the number of CPUs you have
# 要启动的进程数,大致是你拥有的 CPU 数
numprocs=4
# Give each process a unique name so they can be told apart
# 给每个进程一个唯一的名称,以便区分它们
process_name=asgi%(process_num)d
# Automatically start and recover processes
# 自动启动和恢复进程
autostart=true
autorestart=true
# Choose where you want your log to go
# 选择你希望日志去的地方
stdout_logfile=/home/qbc/web/deploy/asgi/asgi.log
redirect_stderr=true
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
安装supervisor的方式非常多,最简便的就是以下两种,直接安装在整个系统当中或者安装在python项目的虚拟环境当中!
# 直接安装在系统当中,整个环境中都有
sudo apt-get install supervisor
# 可以在虚拟环境中通过pip安装
pip3 install supervisor
echo_supervisord_conf > /home/qbc/web/deploy/supervisord.conf
备注:在任意文件夹下运行该命令,如果后边未指定存放配置文件的路径,而是单纯的指定了supervisord.conf的配置文件名,那么他会在当前文件夹下生成默认配置!
注意以下几处的配置路径,可自行修改,我们这里就全部存放到项目的deploy目录中
如果下边两项被注释掉了,那么取消注释,否则supervisorctl的相关命令无法运行!
将我们之前存放daphne配置文件的路径引入到最后
[include]
files = /home/qbc/web/deploy/asgi/*.ini
备注:files的路径可自行指定,不是必须非要存放在这里!
supervisord -c /home/qbc/web/deploy/supervisord.conf
备注:-c后边的路径为supervisor配置文件,即supervisord.conf的绝对路径!
运行之后deploy目录则会如下图所示
杀死supervisor进程:kill -s SIGTERM 3652
sudo apt-get install nginx
检查nginx是否安装成功:
nginx -v
查看nginx的版本,如果正确显示格式如这样nginx version: nginx/1.18.0 (Ubuntu)
,那么证明安装成功!
创建nginx配置文件
sudo touch /etc/nginx/conf.d/django_daphne_nginx.conf
使用vim将下边配置信息写入该配置文件中
sudo vim /etc/nginx/conf.d/django_daphne_nginx.conf
打开输入英文字母i,进入写入模式,根据配置文件修改为自己的信息,绑定域名,完成按Esc
键退出编辑模式,之后按:wq
回车退出
upstream channels-backend {
server localhost:8000;
}
server {
listen 80;
server_name 192.168.113.178;
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# location 配置请求静态文件多媒体文件。
location /media {
alias /home/qbc/web/code/media/;
}
# 静态文件访问的url
location /static {
# 指定静态文件存放的目录
alias /home/qbc/web/code/static/;
}
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_pass http://0.0.0.0:8000;
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;
}
}
重载Nginx配置文件
sudo service nginx reload
访问站点,测试是否部署成功!