Django项目部署:django项目中使用channels实现websocket,此项目部署方式

时间:2024-10-19 17:25:24

一、概述:

在django项目中使用websocket功能,使用daphne部署channels,使用uwsgi部署django项目。

同时支持asgi和wsgi,使用nginx做代理。

前端:Vue

后端:django+channels

asgi服务器:daphne

wsgi服务器:uWSGI

代理:Nginx

二、配置

1、项目基本

虚拟环境位置

使用的python -m venv  命令创建的虚拟环境:

  • 具体使用的虚拟环境位置:/mnt/gs/venv/tniy_sys
  • venv目录下有多个项目的虚拟环境,
  • tiny_sys是当前项目的虚拟环境,进来tiny_sys可以看到bin/目录

前端vue打包

打包生成的dist目录,放到

2、daphne配置

安装包:

pip install daphne

简单的启动命令:

## 先进入虚拟环境
source /mnt/gs/venv/tiny_sys/bin/activate

## 启动项目,进入项目根目录下
daphne -b 127.0.0.1 -p 9802 tiny_sys.asgi:application

封装成shell脚本:

实现启动、关闭和重启, daphne.sh

#!/bin/bash

# 设置项目根目录
PROJECT_ROOT="/mnt/gs/project/tiny_sys"

# 设置 Python 虚拟环境路径(ls 可以看到bin目录)
VENV_PATH="/mnt/gs/venv/tiny_sys"


# 设置 定时器脚本的 启动命令
DAPHNE_COMMAND="$VENV_PATH/bin/daphne -b 127.0.0.1 -p 9802 gzgs_alert.asgi:application"

# 函数: 启动 Daphne 服务
start_daphne() {
    cd "$PROJECT_ROOT"
    #source "$VENV_PATH/bin/activate"
    echo "Starting Daphne server..."
    nohup $DAPHNE_COMMAND >/dev/null 2>&1 &  
    echo "Daphne server started."
}

# 函数: 停止 Daphne 服务
stop_daphne() {
    echo "Stopping Daphne server..."
    pkill -f "$DAPHNE_COMMAND"
    echo "Daphne server stopped."
}

# 函数: 重启 Daphne 服务
restart_daphne() {
    stop_daphne
    start_daphne
}

# 根据命令行参数执行相应的函数
case "$1" in
    start)
        start_daphne
        ;;
    stop)
        stop_daphne
        ;;
    restart)
        restart_daphne
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac
  • 给文件加可执行权限:chmod +x daphne.sh
  • 启动:sh daphne.sh start
  • 重启:sh daphne.sh restart
  • 停止:sh daphne.sh stop

3、uwsgi配置

安装包:

pip install uwsgi

配置文件

名字:uwsgi.ini

[uwsgi]
# 使用nginx连接时 使用
socket=0.0.0.0:9801
# 直接作为web服务器使用
#http=127.0.0.1:8010
# 配置工程目录
chdir=/mnt/gs/project/tiny_sys
# 配置项目的wsgi目录。相对于工程目录
wsgi-file=tiny_sys/wsgi.py
virtualenv =/mnt/gs/venv/tiny_sys
#配置进程,线程信息
listen=1024
processes=2
#进程内存限制
limit-as=2048
threads=4
enable-threads=True
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
#django项目修改完文件后自动重启,可选
py-autoreload=1

4、nginx配置

配置文件:

conf.d/tiny_sys.conf

#das通信使用的
#设定虚拟主机配置
server {
    #侦听80端口
    listen 80;
    server_name  tiny.xxxx.com;
    #定义服务器的默认网站根目录位置
    root /mnt/gs/project/dist;
    #设定本虚拟主机的访问日志
    #access_log  logs/nginx.access.log  main;

    #默认请求: 后端api启动端口是9801
    location / {
        #倒入了uwsgi的配置
        include uwsgi_params; 
        client_max_body_size	50m;
        #连接uwsgi的超时时间
        # uwsgi_connect_timeout 30; 
        #设定了uwsig服务器位置
        uwsgi_pass 127.0.0.1:9801;
    }
    
    # 静态资源
    location /static{
    	alias /mnt/gs/project/tiny_sys/static;
    }
    location /media {
    	alias /mnt/gs/project/tiny_sys/media;
    }
}


#带ws
server {
	server_name tiny.xxxx.com;
	listen 443 ssl;
	#定义使用 www.nginx.cn访问
	ssl on;
	
	#定义服务器的默认网站根目录位置
	ssl_session_timeout 5m; 
	ssl_certificate   /etc/nginx/cert/tiny.xxxx.com.pem;
	ssl_certificate_key  /etc/nginx/cert/tiny.xxxx.com.key;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;
	
	# 系统入口,vue前端打包后的dist目录
	location / {
		add_header Access-Control-Allow-Origin *;
		root /mnt/gs/project/dist/; 
		index index.html;
		autoindex on;
	}
	
	#后端websocket接口,启动端口是9802
	location /ws {
		## channels设置的所有路由都以/socket开头
		proxy_pass http://127.0.0.1:9802/socket;
		#nginx配置支持websocket,下面三条
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";

		#websocket三个超时时间,有默认值
		proxy_read_timeout 600s;
		proxy_connect_timeout 60s;
		proxy_send_timeout 60s;
	
	}
	
	## 代理到http部署的域名
	location /api/ {
		proxy_pass http://tiny.xxxx.com;
		proxy_redirect off;
		proxy_cookie_path / /api/;
	}
	
	## 静态资源
	location /static{
    	alias /mnt/gs/project/tiny_sys/static;
    }
    location /media {
    	alias /mnt/gs/project/tiny_sys/media;
    }
}