一、概述:
在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;
}
}