• 宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程


    第一步:创建Django项目

    1. 使用pip install django安装创建django项目的依赖
    2. 在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下:
      ├── app
      │ ├── init.py
      │ ├── asgi.py
      │ ├── settings.py
      │ ├── urls.py
      │ └── wsgi.py
      ├── manage.py
      └── templates

    第二步:编写测试代码

    1. 在控制台执行python manage.py startapp page创建一个名为page的应用。其目录结构如下:
      ├── app
      │ ├── init.py
      │ ├── asgi.py
      │ ├── settings.py
      │ ├── urls.py
      │ └── wsgi.py
      ├── manage.py
      ├── page
      │ ├── init.py
      │ ├── admin.py
      │ ├── apps.py
      │ ├── migrations
      │ │ └── init.py
      │ ├── models.py
      │ ├── tests.py
      │ └── views.py
      └── templates

    2. 在veiws.py中编写测试代码

    from django.shortcuts import render
    # Create your views here.
    def index(request):
        return render(request, 'index.html', context={'title': '你好, Django!'})
    
    • 1
    • 2
    • 3
    • 4
    1. 在page根目录创建个名为template的文件夹,并在其中创建index.html文件, 输入如下代码:
    
    {% load static %}
    doctype html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport"
            content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>测试页面title>
    head>
    <body>  
      <h2>{{ title }}h2>
      <img src="{% static 'images/code.jpg' %}" alt="code">
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 到app目录下的urls.py添加路由映射
    # urls.py
    from django.contrib import admin
    from django.urls import path
    from page.views import *
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', index, name='index')
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 到app目录下的settings.py中修改配置
    # settings.py
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'page' # 新增之前添加的page应用
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 创建超级管理员用户
      输入命令python manage.py createsuperuser创建一个超级管理员来管理后台系统
    2. 安装django-simpleui美化后台管理系统,并将其添加到settings.py中的INSTALLED_APPS列表中
    pip install django-simpleui
    
    • 1
    INSTALLED_APPS = [
        'simpleui', # 添加到第一行用于美化django自带的后台管理系统
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'page'
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    安装完django-simpleui以后需要在控制台执行一下pyhton manage.py migrate命令,才能激活simpleui的样式.
    此时我们可以执行命令python manage.py runserver 127.0.0.1:8000看一下页面长什么样。
    前台页面:
    在这里插入图片描述
    后台页面:
    在这里插入图片描述
    在这里插入图片描述

    1. 收集静态资源
    • 在app根目录创建一个static目录
      在这里插入图片描述

    • 由于需要部署到生产环境,所以这里需要操作一下收集静态资源命令。在此之前我们需要先修改settings.py配置文件

    # 开发模式设成True, 生产模式设成False
    DEBUG = False
    # 允许访问的主机(已解析的域名或ip地址)
    ALLOWED_HOSTS = ['www.xxx.com', 'xxx.com']
    # 合法的csrf_trusted. 如不指定, 会导致后台admin页面无法使用
    CSRF_TRUSTED_ORIGINS = ['https://www.xxx.com', 'https://xxx.com']
    
    # ...此处省略一些默认配置
    
    # Static files (CSS, JavaScript, Images)
    STATIC_URL = 'static/'
    # STATICFILES_DIRS = [
    #     os.path.join(BASE_DIR, "static"),    # 开发模式
    # ]
    STATIC_ROOT = os.path.join(BASE_DIR, "static") # 生产模式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 执行命令收集静态资源
    python manage.py collectstatic
    
    • 1

    执行完这句命令后,静态资源会被收集到STATIC_ROOT所指定的目录中(如上图所示),django-simpleui的相关样式文件也会被一并收集到static目录中。如过不执行此操作,项目部署成功上线后,将无法看到图片、css、js等静态资源。

    1. 上述步骤完成后,就可以开始配置docker+nginx+gunicorn相关的配置文件了。

    第三步:搭建项目部署所需要的环境和相关配置文件

    1. 生成requirement.txt文件
      由于项目部署到服务器中,需要一个新的python环境,该python环境需要下载本项目所需的依赖,所以需要一个requirements.txt文件。
      执行命令: pip freeze > requirements.txt即可在根目录中生成一个requirements.txt文件
    # requirements.txt
    asgiref==3.8.1
    Django==5.0.4
    django-simpleui==2024.4.1
    sqlparse==0.5.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 在app根目录下新建Dockerfile文件, 并加入如下配置:
    # Dockerfile
    FROM python:3.10
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制项目文件到工作目录
    COPY . /app
    
    # 设置清华 pip 镜像
    ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
    ENV PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn
    
    # 安装项目依赖
    RUN pip3 install --no-cache-dir -r requirements.txt
    
    RUN pip3 install gunicorn
    
    RUN python3 manage.py makemigrations
    
    RUN python3 manage.py migrate
    
    # 设置环境变量
    ENV PYTHONUNBUFFERED 1
    
    # 设置静态文件的路径
    ENV STATIC_ROOT /app/static
    
    # 设置 Django 的配置文件环境变量
    ENV DJANGO_SETTINGS_MODULE app.settings
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    1. 在app根目录下新建docker-compose.yml文件, 并加入如下配置:
    # docker-compose.yml
    services:
      web:
        build: .
        # ports:
        #   - "8000:8000"
        volumes:
          - gunicorn_sock:/app/var/run  # 挂载 gunicorn_sock 卷到 web 容器的 /app/var/run 目录
        command: ["gunicorn", "--bind", "unix:/app/var/run/gunicorn.sock", "app.wsgi:application"]   
        networks:
          - app-network
    
    
      nginx:
        image: nginx:latest
        ports:
          - "80:80"
          - "443:443" # https默认端口号, 如果不需要则无需此行配置
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf:ro # ro表示文件只读的意思
          - ./static:/app/static:ro  # Nginx容器中的静态文件路径
          - ./certificate.pem:/etc/nginx/ssl/certificate.pem:ro # ssl证书文件(如不需要则可以不要此行配置)
          - ./private.key:/etc/nginx/ssl/private.key:ro # ssl证书文件(如不需要则可以不要此行配置)
          - gunicorn_sock:/app/var/run  # 挂载 gunicorn_sock 卷到 nginx 容器的 /app/var/run 目录    
        depends_on:
          - web
        networks:
          - app-network        
    # 保证nginx容器和django容器在同一个网络下,否则socket通信会出问题
    networks:
      app-network:
        driver: bridge
        
    
    volumes:
      gunicorn_sock:  # 定义socket共享卷, 保证两个容器都能访问到
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    1. 在app根目录下新建nginx.conf配置文件
    # nginx.conf
    worker_processes auto;  # 使用CPU核心数来设置工作进程的数量
    
    events {
        worker_connections 1024;
    }
    http {
        include  mime.types;  # 包含默认的MIME类型文件
        default_type  application/octet-stream;  # 默认的MIME类型
        server {
            listen 80;
            server_name www.xxx.com; # 改成你的域名
            location / {
                return 301 https://$host$request_uri;
            }
    
        }
        server {
            listen 443 ssl http2;
            server_name www.xxx.com;  # 改成你的域名
            ssl_certificate /etc/nginx/ssl/certificate.pem;
            ssl_certificate_key /etc/nginx/ssl/private.key;
            location / {
            	#端口号方式
                #proxy_pass http://web:8000;
                #proxy_set_header Host $host;
                #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                # 连接到 Gunicorn 套接字
                proxy_pass http://unix:/app/var/run/gunicorn.sock;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    	    
    	    # 代理django项目中的静态资源
            location /static/ {
                alias /app/static/;  # 静态文件的路径;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    1. 将ssl证书文件复制粘贴到app根目录中(如不启用https则不需要此操作)
      在这里插入图片描述

    第四步:进入宝塔面板正式开始部署项目

    1. 将本地的app项目打包成zip文件,上传至宝塔面板的/www/wwwroot目录下并解压。如下图所示:、
    2. 进入到app目录中并打开终端开始执行命令
      在这里插入图片描述
    3. 在宝塔打开的控制台中执行命令
    • 构建镜像:
    docker-compose build
    
    • 1

    等待容器构建完成即可。

    • 运行镜像:
    docker-compose up -d
    
    • 1

    执行完此行命令,就代表我们的项目部署成功了。

    接下来我们可以通过命令的方式查看项目是否成功运行中。

    • docker查看正在运行的镜像
    docker ps
    
    • 1

    在这里插入图片描述
    我们可以看到,docker容器中有两个正在运行的镜像,一个是nginx:latest,一个是app-web,并且app-web是通过gunicorn的方式部署的。

    接下来我们就可以去浏览器中输入ip地址或者已绑定的域名查看项目了。

  • 相关阅读:
    R语言GLM广义线性模型:逻辑回归、泊松回归拟合小鼠临床试验数据(剂量和反应)示例和自测题
    QT--多线程与MySQL数据库
    2021-09-21如何在PCB上做一个城市地铁图?
    Django实现音乐网站 ⒅
    七个研究生必备高效科研网站
    K8S安装部署 初始化操作(一)
    解决远程git服务器路径改变导致本地无法push的问题
    ctf_show笔记篇(web入门---文件包含)
    面试经常问的Linux进程到底是什么呢?1W字从0到1详解进程的所有细节!
    Python相关性分析代码
  • 原文地址:https://blog.csdn.net/m0_46219714/article/details/137961471