由于公司项目要使用到websocket 而且项目使用了python Django3 所以自己记录一下部署过程
首先介绍下django项目结构
asgi 是一种异步网关协议接口,一个介于网络协议服务和Python
应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP
,HTTP2
和WebSocket
。由于项目中使用了django-channels来做websocket 所以部署到服务器之后要使用Asgi协议
congig是放Nginx的配置文件
uwsgi.ini 主要是我们启动Uwsgi的基本基础配置
Dockerfile 和 docker-compost.yml 就不做过多介绍了 下面会贴代码
其他的都是基础的django文件。
FROM python:3.8
WORKDIR /usr/src/app # 在容器里面创建文件
COPY requirements.txt ./
#ADD requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.douban.com/simple
COPY . ./ # 把我们的本地django项目复制到容器里面
EXPOSE 8000
这是django项目的dockerfile文件 都是一些基本的配置
然后编写我们的docker-compost文件
version: "3"
services:
app:
restart: always
# image: my_python # 这里可以选择app image是已经build好的镜像
build: . # 也可以直接build 我们的dockerfile文件
command: bash start.sh # 可以写一些脚本文件执行 我bash里面写的就是启动uwsgi和 asgi服务
volumes:
- .:/usr/src/app # 将当前项目隐射到容器里面
- static-volume:/usr/src/app/static
- media-volume:/usr/src/app/media
- ./config/supervisor:/var/supervisor/conf.d # 这里是本来想 部署supervisor 管理进程写上去的
ports:
- "8000:8000" # 端口映射
depends_on: # 这里的意思是 app build的时候依赖下面redis和mysql 要build好他们才能运行
- redis
- db
networks: # 集群的通信网络名称 可以理解为是链接了那些网线
- web_network
- db_network
db:
image: mysql:5.7
container_name: db
volumes:
- "./mysql:/var/lib/mysql"
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES UTF8MB4;' --sql-mode="NO_ENGINE_SUBSTITUTION" --innodb-flush-log-at-trx-commit=0
ports:
- "3306:3306"
restart: always
environment: # 生成容器的基础配置 创建密码和你生成容器的第一张表
- MYSQL_ROOT_PASSWORD=youpassword
- MYSQL_DATABASE=you_database
networks:
- db_network
redis:
restart: always
image: redis:3.0.6
container_name: redis
ports:
- "6379:6379"
networks:
- db_network
nginx:
restart: always
image: nginx:1.10.3
ports:
- "80:80"
volumes:
- static-volume:/usr/src/app/static
- media-volume:/usr/src/app/media
- ./config/nginx:/etc/nginx/conf.d
depends_on:
- app
networks:
- web_network
networks:
web_network:
driver: bridge
db_network:
driver: bridge
volumes:
static-volume:
media-volume:
[uwsgi]
chdir=/usr/src/app
socket=0.0.0.0:8001
master=true
processes=2
threads=4
# Django's wsgi file
module=djangoProject.wsgi
buffer-size = 65536
# chmod-socket=664
# clear environment on exit
vacuum = true
# logto=/usr/src/app/log/uwsgi.log
import os
from django.core.asgi import get_asgi_application
# 下面记得如 将DjangoProject 修改为你们的项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject.settings')
django_asgi_app = get_asgi_application()
from django.urls import re_path, path
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from table.consumers import TableConsumer
application = ProtocolTypeRouter({
# "http": django_asgi_app,
'websocket': AuthMiddlewareStack(
URLRouter([
path('ws/table//', TableConsumer),
# path('ws/table/stenography//', TableConsumer),
])
),
})
这里是主要是启动项目 启动 uwsgi -d 是为了让uwsgi在后台运行 然后可以接着跑下面的代码 启动daphne
daphne的话 是支持uwsgi的接口服务服务器
uwsgi -d --ini uwsgi.ini&&
daphne -b 0.0.0.0 -p 8002 djangoProject.asgi:application
# 配置 uwsgi端口
upstream sid {
ip_hash;
server app:8001;
}
# 配置 daphne端口信息
upstream table {
ip_hash;
server app:8002;
}
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
# 静态文件路径
location /static/ {
autoindex on;
alias /usr/src/app/static/;
}
location /media/ {
autoindex on;
alias /usr/src/app/media/;
}
location / {
uwsgi_pass sid;
include uwsgi_params;
}
location /ws { # 这里配置nginx监听到ws的请求的时候转发到那个端口
proxy_pass http://table;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
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;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
}
}