首页 > 数据库 >Docker部署Django+MySQL+Redis+Nginx+uWSGI+Celery(超详细)

Docker部署Django+MySQL+Redis+Nginx+uWSGI+Celery(超详细)

时间:2024-07-08 14:57:45浏览次数:10  
标签:celery djangoProject2 py Redis Django Celery nginx conf import

一、知识储备

经过我们之前学习的Docker相关知识,现在我们来进行实战,以下介绍如何通过Docker Compose部署Django项目:

先前知识:

Docker学习笔记(一)概念理解-CSDN博客

Docker学习笔记(二)镜像、容器、仓库相关命令操作-CSDN博客

Docker学习笔记(三)Dockerfile-CSDN博客

Docker Compose | 菜鸟教程 (runoob.com)

二、项目目录结构说明

DjangoTest               ## 项目根路径
│  docker-compose.yml            # docker-compose文件
│  Dockerfile                    # 部署django项目的dockerfile
│  requirements.txt              # 项目必须要安装的文件 pip freeze > requirements.txt
│
├─nginx                      ## nginx容器配置文件
│  │  nginx.conf                 # /etc/nginx/nginx.conf配置文件
│  │
│  └─conf                        # /etc/nginx/conf.d配置nginx文件夹
│          default.conf
│
└─djangoProject2                        ## 部署django项目的web容器
    │  manage.py
    │  uwsgi.ini                 # django项目的uwsgi配置文件 
    │
    ├─app01
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tasks.py               # 配置celery任务文件
    │  │  tests.py
    │  │  urls.py
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─migrations
    │  │      __init__.py       
    │  
    │
    └─djangoProject2
            celery.py           # celery配置文件
            settings.py
            urls.py
            wsgi.py
            __init__.py

三、项目文件说明

1.docker-compose.yml文件

version: '3'

services:
  mysql:
    image: mysql:8.0
    volumes:
      - ./mysql:/var/lib/mysql
    expose:
      - "3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=543720aini    #mqsql服务器root密码
      - MYSQL_DATABASE=test   #数据库名
      - MYSQL_USER=test    #用户
      - MYSQL_PASSWORD=543720aini  #数据库密码

  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf:/etc/nginx/conf.d
    ports:
      - "80:80"
    depends_on:
      - web

  redis:
    image: redis:alpine
    expose:
      - "6379"
    restart: always

  web:
    build: .
    ports:
       - "8000:8000"   #主机端口和容器端口映射,要和下面的uwsgi.ini文件中的socket保持一致
    command: ./start.sh
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    expose:
      - "8000"
    depends_on:
      - mysql
      - redis

  celery:
    build: .
    command: celery -A djangoProject2 worker -l info
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    depends_on:
      - mysql
      - redis

  celery-beat:
    build: .
    command: celery -A djangoProject2 beat -l info  # 新增的服务,用于启动Celery Beat
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    depends_on:
      - mysql
      - redis

DjangoTest\djangoProject2\start.sh

#!/bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000  #端口要和上面的web中的配置一样
uwsgi --ini uwsgi.ini

2.web向配置文件

Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple && apt-get update && apt-get install -y uwsgi uwsgi-plugin-python3

DjangoTest\djangoProject2\uwsgi.ini

[uwsgi]
socket=:8000   #和docker-compose.yml文件中的web下暴露的端口一样
chdir=/code/djangoProject2
module=djangoProject2.wsgi:application
pidfile=/tmp/web-master.pid
master=True
vacuum=True
processes=1
max-requests=5000
post-buffering=8192

3.nginx容器相关配置文件

DjangoTest\nginx\nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

DjangoTest\nginx\conf\default.conf

server {
    listen                  8080;
    server_name             xxxx;  #换成自己服务器的ip或域名(我用的是阿里云服务器,我这里配置的是阿里云的公网ip
    charset                 utf-8;
    client_max_body_size    10M;

    location /static/ {
        alias   /django_static/;
    }

    location / {
        include     uwsgi_params;
	proxy_pass  http://web:8000; # 代理的端口
        proxy_pass_header Server;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Scheme $scheme;
    }
}

4.celery配置文件

DjangoTest\djangoProject2\djangoProject2\celery.py

import os
from celery import Celery
from django.conf import settings

# 只要是想在自己的脚本中访问Django的数据库等文件就必须配置Django的环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject2.settings')

# app名字
app = Celery('djnagoProject2')
app.conf.timezone = 'Asia/Shanghai'
app.conf.enable_utc = False

# 配置celery
class Config:
    BROKER_URL = 'redis://redis:6379/1'
    CELERY_RESULT_BACKEND = 'redis://redis:6379/2'



app.config_from_object(Config)
# 到各个APP里自动发现tasks.py文件
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

DjangoTest\djangoProject2\djangoProject2\__init__.py

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from djangoProject2.celery import app as celery_app

__all__ = ['celery_app']

DjangoTest\djangoProject2\app01\tasks.py

# Create your tasks here
import datetime

from celery.schedules import crontab
from celery.task import periodic_task
from django.db import transaction
from djangoProject2.celery import app

from .models import Worker


@periodic_task(run_every=crontab(minute="0",hour="0",day_of_week="1"))
def create_worker():
    now_time = datetime.datetime.now()
    with transaction.atomic():
        Worker.objects.create(name=str(now_time.strftime("%H:%M:%S")), age=int(now_time.second))


@app.task
def update_worker():
    now_time = datetime.datetime.now()
    with transaction.atomic():
        Worker.objects.update(age=int(now_time.second))

5.settings配置文件

修改配置文件相关信息

ALLOWED_HOSTS = ["*"]

#如果涉及跨域,则需要进行其他的配置,在这里不阐述
...


INSTALLED_APPS = [
    ...
    'django_celery_results',   
    'django_celery_beat',
    'app01'
]


#Celery相关配置
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'  # 使用数据库调度器



#下面的配置和docker-compose.yml中的mysql下的environment配置一致
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "test",
        "USER": "root",
        "PASSWORD": "543720aini",
        "HOST": "localhost",
        "PORT": "3306",
    }
}

6.初始化一个Django项目

DjangoTest\djangoProject2\djangoProject2\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
]

DjangoTest\djangoProject2\app01\urls.py

from django.urls import path
from app01 import views
urlpatterns = [
    path('index', views.index, name='index')
]

DjangoTest\djangoProject2\app01\views.py

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import resolve, reverse

from app01.tasks import update_worker


# Create your views here.
def index(request):
    update_worker.delay()
    return HttpResponse("Hello Docker")

DjangoTest\djangoProject2\app01\models.py

from django.db import models


# Create your models here.
class Worker(models.Model):
    name = models.CharField("名字", max_length=64, default="")
    age = models.IntegerField("年龄")

    class Meta:
        verbose_name = "劳动者"

四、使用 Compose 命令构建和运行您的应用

在DjangoTest目录下运行docker-compose up命令,看到如下图所示,则说明部署成功:

五、访问刚刚部署的应用

路由是你在DjangoTest\nginx\conf\default.conf中配置的service_name,端口是docker-compose.yml文件中web的port,如http://xxxx:8000/app01/index

标签:celery,djangoProject2,py,Redis,Django,Celery,nginx,conf,import
From: https://blog.csdn.net/m0_71660867/article/details/140265123

相关文章

  • nginx作为反向代理服务器:代理MySQL、Postgresql、Redis及多个TCP服务
    使用Nginx作为反向代理服务器,可以代理MySQL、PostgreSQL、Redis及多个TCP服务。这需要配置Nginx的stream模块。以下是详细的配置步骤:1.确保Nginx支持stream模块首先,确保Nginx已经编译并支持stream模块。运行以下命令检查:nginx-V在输出中查找--with-str......
  • Redis 超全面试题及答案整理,最新面试题
    Redis面试题及答案整理,最新面试题Redis持久化机制有哪些?Redis支持两种主要的持久化机制:RDB(快照)和AOF(追加文件)。1、RDB(RedisDatabase):在指定的时间间隔内,执行快照存储,将内存中的所有数据保存到磁盘上的一个快照文件中。这个机制可以通过在redis.conf配置文件中设置不同......
  • django相关问题
    django相关问题orm相关问题1.编写orm在数据库中添加字段,遇到以下内容(.venv)E:\document\py_object\fun_object\wuruntao>pythonmanage.pymakemigrationsItisimpossibletoaddanon-nullablefield'phone'touserwithoutspecifyingadefault.Thisisbecauseth......
  • Spring Boot Redis 集群性能优化(基于 Redisson)
    1.SpringBootRedis集群性能优化(基于Redisson)1.1.版本说明1.2.为什么是Redisson1.3.参数优化1.3.1.Redisson配置参数1.3.1.1.通用参数1.3.1.2.集群参数1.3.1.3.最终参数配置1.4.从Nacos获取Redisson配置1.SpringBootRedis集群性能优化(......
  • Redisson锁误删除
    1、目标本文的主要目标是探究Redisson分布式锁在设置过期时间的情况下多线程是否会误删除的问题,首先分析单线程执行的完整过程,然后分析多线程锁误删除的现象,接着进行源码分析,理解Redisson如何保证多线程场景下当前线程不会误删除其他线程id的锁,最后是总结2、单线程执行的......
  • SpringBoot整合Radis(redis启用,maven依赖,及具体实用)
    文章目录1、本地下载redis并且开启2、导入maven依赖3、添加application.properties4、创建配置类RedisConfig.java5、使用1、注解1、@Cacheable(value="",key="")2、**@CachePut**(value="",key="")3、CacheEvict(value="",key="")2、示例1、本地下......
  • [Redis]一致性哈希
    一致性哈希算法(ConsistentHashing)最早在论文《ConsistentHashingandRandomTrees:DistributedCachingProtocolsforRelievingHotSpotsontheWorldWideWeb》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-......
  • NoSQL之Redis集群
    目录1.Redis主从复制(1)Redis主从复制工作原理(2)搭建Redis主从复制2.Redis哨兵模式(1)Redis哨兵工作原理(2)搭建Redis哨兵模式3.Redis集群模式(1)集群模式的工作原理(2)集群模式的特点(3)搭建Redis群集模式(4)集群模式与哨兵模式的主要区别1.Redis主从复制(1)Redis主从复制工作原理1.......
  • NoSQL之 Redis配置与优化
    目录1.关系数据库和非关系数据库2.Redis安装部署(1)Redis简介(2)Redis为什么那么快?(3)Redis安装部署(1)环境准备(2)安装redis(3)修改配置文件(4)定义systemd服务管理脚本(4)redis-benchmark测试工具3.Redis数据库常用命令(1)Redis数据类型4.Redis高可用(1)Redis持久化5.Redis性能管理(1)内存碎片6.re......
  • 基于django(爱抚宠物) 小程序设计和实现(源码+LW+部署讲解)
    感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的......