IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker部署Django+Uwsgi+Nginx+Asgi(daphne) -> 正文阅读

[系统运维]Docker部署Django+Uwsgi+Nginx+Asgi(daphne)

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

首先介绍下django项目结构

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/<slug:table_id>/', TableConsumer),
            # path('ws/table/stenography/<slug:table_id>/', 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;
   }
}

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:44:38  更:2021-08-29 09:47:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:03:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码