Docker部署Django+Uwsgi+Nginx+Asgi(daphne)

由于公司项目要使用到websocket 而且项目使用了python Django3 所以自己记录一下部署过程

首先介绍下django项目结构

Docker部署Django+Uwsgi+Nginx+Asgi(daphne)_第1张图片

asgi 是一种异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTPHTTP2WebSocket。由于项目中使用了django-channels来做websocket 所以部署到服务器之后要使用Asgi协议

congig是放Nginx的配置文件

uwsgi.ini 主要是我们启动Uwsgi的基本基础配置

Dockerfile 和 docker-compost.yml 就不做过多介绍了 下面会贴代码

其他的都是基础的django文件。

dockerfile文件:

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.ini文件

[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

asgi的配置文件(需要启动daphne服务支持asgi)

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),
        ])
    ),
})

脚本代码 start.sh

这里是主要是启动项目 启动 uwsgi -d 是为了让uwsgi在后台运行 然后可以接着跑下面的代码 启动daphne

daphne的话 是支持uwsgi的接口服务服务器


uwsgi -d --ini uwsgi.ini&&
daphne -b 0.0.0.0 -p 8002 djangoProject.asgi:application

nginx配置

# 配置 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;
   }
}

你可能感兴趣的:(django,docker,nginx)