Django 项目部署

2023-11-19

Django 项目部署

1. 概述

将开发完成的 Django 项目部署到指定的服务器上,而服务器的系统基本都是 linux。

Django 项目当前最主要的部署方式是:Python+Django+Nginx+uWSGI

  • python:是 python 程序运行的环境
  • Django:是项目开发的主要框架,也特指我们开发的 django 项目
  • Nginx:反向代理服务器,用于实现对用户请求的转发,转发给 uWSGI,主要实现 3 个功能:
    • 反向代理
    • 动静分离
    • 负载均衡
  • uWSGI:python 的 web 服务器,使用 WSGI 协议和 django 项目交互,使用 uwsgi 协议和 nginx 进行通信

2.Django 项目处理

前提是已经开发完毕的项目

在 settings.py 修改

# 修改通用配置
DEBUG = False

ALLOWED_HOSTS = ['*']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'deploy_study',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '192.168.134.1',
        'PORT': '3306',
    }
}
# 静态文件处理
# url中访问静态文件的url起始path
STATIC_URL = '/static/'

# 合并后的静态文件目录的绝对路径,需要在根目录添加 static 目录
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# 以下不是必须的, 扩展的静态文件地址,需要添加 common_static 目录
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'common_static'),
)

说明:

  • 修改 DEBUG 为 False,同时必须配置 ALLOWED_HOSTS ,内容是允许访问的域名列表,使用 * 表示通配符
  • 修改数据库连接为 生产环境 下使用的
  • 主要需要添加 STATIC_ROOT 配置,用于部署后,合并各个子应用下的静态文件
  • 部署后,别忘记使用 python manage.py collectstatic命令,合并各个子应用下的静态文件,然后在 处理静态文件的服务器中(如 nginx)配置到该路径

python 环境处理

在 django 项目的根目录,生成一个 requirements.txt

# 如果使用的第三方库比较少,那么可以手写一个 requirements.txt
# 如果使用的第三方库较多,那么就使用以下命令:
pip freeze > requirements.txt

# 拷贝上述的文件到服务器中,并且执行以下命令安装环境
pip3 install -r requirements.txt

复制项目文件到服务器

将项目拷贝 linux 系统中(譬如 FTP),然后移动到 /var/www/ 目录下

mv /ftp/childrenshop /var/www/

PS:拷贝完成后,记得执行合并 static 的命令python manage.py collectstatic

安装和使用 uWSGI

1、 uwsgi 官方文档

2、 在生产环境中,使用虚拟环境,一般我们的 linux 中,会有 2 套 python,一个是系统自带的 python2,一个是我们的项目环境所需的 python3

# 使用以下命令查看
python2 -V
python3 -V

3、 在环境中安装项目所需第三方库,假定当前 djang 项目(项目名:childrenshop)已经拷贝到 /var/www 目录下,并且目录中已经有 requirements.txt 文件

# 切换到 项目路径
cd /var/www/children

# 安装环境
pip3 install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4、 使用 pip 安装 uwsgi

pip3 install uwsgi==2.0.18 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • -i : 指定镜像源的网址,这里使用的豆瓣
  • –trusted-host : 信任 -i 指定的网站,不进行信任的话,会出现 SSL 错误

5、测试 uwsgi

编写一个测试的 py 文件

vi test.py

文件内容如下:

#!/usr/bin/env python3
# coding:utf-8

import sys

def application(env,start_response):
    start_response('200 OK',[('Content-Type','text/html')])
    return 'Welcome to use uwsgi!!!'.encode()

运行:

/usr/local/python36/bin/uwsgi --http 0.0.0.0:8997 --wsgi-f /var/www/childrenshop/test.py

注意:

由于我们需要从本机访问 linux 的 8997 端口,因此需要设置 linux 的防火墙:

# 开放8997端口
firewall-cmd --zone=public --add-port=8997/tcp --permanent

# 删除端口
firewall-cmd --zone=public --remove-port=8997/tcp

# 重启防火墙
firewall-cmd --reload

# 查看防火墙状态
firewall-cmd --list-all

在浏览器中,访问: http://192.168.134.101:8997 ,注意修改对应的 ip 地址

即可查看到类似如下页面中显示:

Welcome to use uwsgi!!!

6、 使用 uwsgi 启动 django:

使用 ini 格式配置文件,文件名 uwsgi.ini :

vi uwsgi.ini

文件内容:

[uwsgi]
# 虚拟主机模式
vhost = false
# ip端口
socket = 0.0.0.0:8997
# 是否主服务器
master = true
# 是否多线程
enable-threads = true
# 工作进程数
workers = 5
# wsgi文件的位置
wsgi-file = /var/www/childrenshop/childrenshop/wsgi.py
# 项目的根目录
chdir = /var/www/childrenshop/

# 设置 pid 记录文件
pidfile = /var/run/uwsgi.pid
# 后台运行uwsgi, 如果想实时查看日志内容,可以使用 tail -f uwsgi.log
daemonize = /var/www/childrenshop/logs/uwsgi.log

说明:

  • daemonize 指定 log 输出, 需要创建对应的 目录
  • 如果是想要通过浏览器访问的话,需要将配置中的 socket = 修改为 http = ,否则会报以下错误:
invalid request block size: 21573 (max 4096)...skip

同时需要在防火墙中开放 8997 端口,如果上面已经开放过了,就不需要再额外处理

启动 uwsgi:

/usr/local/python36/bin/uwsgi --ini /var/www/childrenshop/uwsgi.ini

也可以先创建链接,再运行:

ln /usr/local/python36/bin/uwsgi /usr/bin/uwsgi

uwsgi --ini /var/www/childrenshop/uwsgi.ini

如果不以后台模式启动,会得到如下界面:

备注:

如果需要使用 killall 命令关闭所有的 uwsgi 进程的话,需要安装库:

yum install -y psmisc

安装完毕后,可以使用以下命令关闭 uwsgi 进程

killall -9 uwsgi

7、设置启动脚本,service 方式

在/etc/init.d/ 目录下建立 3 个脚本:

uwsgi-start.sh

#!/bin/bash -e

export LD_LIBRARY_PATH="/usr/local/lib"

/usr/local/python36/bin/uwsgi --ini /var/www/childrenshop/uwsgi.ini

说明: export LD_LIBRARY_PATH=“/usr/local/lib” 这一行是为了防止 出现 sqlite 版本错误

uwsgi-stop.sh

#!/bin/bash -e

/usr/local/python36/bin/uwsgi --stop /var/run/uwsgi.pid

说明:/var/run/uwsgi.pid 是在 uwsgi.ini 中配置的

uwsgi-restart.sh

#!/bin/bash -e

/usr/local/python36/bin/uwsgi --reload /var/run/uwsgi.pid

脚本赋予权限:

chmod 755 uwsgi-start.sh
chmod 755 uwsgi-stop.sh
chmod 755 uwsgi-restart.sh

编写 service 脚本:

vi /usr/lib/systemd/system/uwsgi.service

填入以下内容:

[Unit]
Description=uwsgi
After=network.target

[Service]
Type=forking
PIDFile=/var/run/uwsgi.pid
ExecStart=/etc/init.d/uwsgi-start.sh
ExecReload=/etc/init.d/uwsgi-restart.sh
ExecStop=/etc/init.d/uwsgi-stop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

说明:

  • 以上出现的路径必须是绝对路径
  • ExecStart、ExecReload、ExecStop 3 个分别对应 启动、重新启动、停止
  • PIDFile 对应启动后的 pid 保存文件

设置自启动

systemctl enable uwsgi.service

说明: .service 可以省略

# 启动
systemctl start uwsgi

# 停止
systemctl stop uwsgi

# 重启
systemctl restart uwsgi
[Install]
WantedBy=multi-user.target

说明:

  • 以上出现的路径必须是绝对路径
  • ExecStart、ExecReload、ExecStop 3 个分别对应 启动、重新启动、停止
  • PIDFile 对应启动后的 pid 保存文件

设置自启动

systemctl enable uwsgi.service

说明: .service 可以省略

# 启动
systemctl start uwsgi

# 停止
systemctl stop uwsgi

# 重启
systemctl restart uwsgi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 项目部署 的相关文章

随机推荐

  • vue3 组件传值之 props 与 attrs 的区别

    最近在学习 vue3 整理了一些学习笔记 如果有人看到 并发现我有写的不对的地方 欢迎指正 用过 vue 组件传值的小伙伴都知道 props 这个属性 而 attrs 属性可以看做 props 的加强版 用来简化 vue 组件传值 那么这两
  • 条件变量(condition variable)详解

    原理 假设我们需要解决这样一个问题 一个列表记录需要处理的任务 一个线程往此列表添加任务 一个线程processTask处理此列表中的任务 这个问题的一个关键点在于processTask怎么判断任务列表不为空 一般有两种方法 一 proce
  • Mathematica的Combinatorica`程序包来研究分拆

    文章目录 引论 步骤 0x00 导入程序包 0x01 Partitions 0x02 Compositions Log 引论 分拆可以看我的这篇文章 在线的Combinatorica 程序包文档可以看这个 在线的Combinatorica
  • 我所理解的RSA加密算法

    RSA简介 非对称加密算法 有一对公私钥组成 1977年由三位数学家Rivest Shamir 和 Adleman 设计了一种算法 没错RSA是三个人名字的首字母 密钥越长越难破解 1024位目前无法破解 因此1024位的RSA密钥基本安全
  • 实现instanceof操作符

    实现instanceof操作符 const theInstanceof function object constructor if typeof object object typeof constructor function retu
  • Spark学习(文件读取路径)

    在不同的启动模式下 加载文件时的路径写法是不一样的 对于local模式下 默认就是读取本地文件 而在standlone或者yarn client 或者cluster模式下 默认读的都是hdfs文件系统 这几种模式下很难读取本地文件 这是很显
  • Qt 信号和槽的小问题(新手向)

    Qt项目报错 static assertion failed Signal and slot arguments are not compatible 信号和槽的参数不对应 例 槽函数 void A give QString a qDebu
  • 内存数据库-3-[redis]的架构原理和部署模式

    参考redis三种模式对比 Redis 是一个开源的 key value 存储系统 由于出众的性能 大部分互联网企业都用来做服务器端缓存 1 单实例模式 问题 1 内存容量有限 2 处理能力有限 3 无法高可用 Redis 在3 0版本前只
  • 我的股票项目环境配置过程记录(含python打包方法linux windows)

    股票项目从源码配置环境 V1 0 Windows 如果只是跑只需要这两个 pip3 install PyQt5 i https pypi douban com simple pip install U matplotlib pip inst
  • 直流-直流(DC-DC)变换电路

    直流 直流 DC DC 变换电路 可以将一种直流电源经过变换电路后输出另一种具有不同输出特性的直流电源 可以是一种固定电压或可调电压的直流电 按照电路拓扑结构的不同 DC DC变换电路可以分成两种形式 不带隔离变压器的DC DC变换电路和带
  • Tomcat7安装及配置教程

    Apache Tomcat7 0安装及配置教程 Apache Tomcat7 0官方网站链接 http tomcat apache org apache tomcat 7 0 73 windows x64 先解压下载的压缩包 然后在bin目
  • 使用express封装一个简单的http代理服务器以及手动设置Access-Control-Allow-Origin解决跨域问题

    一 跨域是什么 先来了解一下什么是跨域 才能知道如何解决跨域问题 跨域 出于浏览器的同源策略限制 使浏览器不能执行其他网站的脚本 同源策略是浏览器对 javascript 施加的安全限制 所谓同源就是指在同一个域内 就是两个地址具有相同的协
  • 自学Java的知识盲点(面向对象编程)

    目录 1 类和对象 1 1对象 属性 行为 1 1 1属性 成员变量 1 2类和对象的内存分配机制 1 3构造方法 1 3 1this关键字 1 4访问修饰符 2 封装 2 1定义 3 继承 ctrl h可以看继承关系 3 1基本介绍 本质
  • VS2019配置QT及打开项目报错处理

    放在一起是因为配置的拖了比较久 于是就放一起 以后要是遇到了 能够处理 也希望对遇到同样问题的能有所参考 对于下载安装qt的教程就不写了 因为已经好些优秀的文章了 这里把一位博主的地址放一下 可以看看qt下载 里面分享了下载的国内镜像地址
  • STM32CubeMAX:H库函数整理笔记

    GPIO HAL GPIO TogglePin GPIO TypeDef GPIOx uint16 t GPIO Pin 功能 用于切换指定的GPIO引脚 HAL GPIO EXTI Callback uint16 t GPIO Pin 功
  • Windows应急响应-入侵排查

    Windows应急响应 入侵排查 1检测系统账户安全 查看服务器有没有可疑账户新增账户 Win R lusrmgr msc 看有没有新增加用户 查看服务器有没有隐藏用户克隆账户 第一步 Win R打开运行窗口 输入regedit打开注册表编
  • cehp 维护(二)常见告警维护

    零 修订记录 序号 修订时间 修订内容 1 2021 11 18 新增 一 摘要 笨猪主要介绍ceph常见告警及维护方法或过程中遇到的问题 二 环境信息 2 1 ceph版本 cephadmin proceph01 ceph v ceph
  • 为什么不发展三进制计算机,三进制计算机

    三进制计算机 是以三进法数字系统为基础而发展的计算机 三进制逻辑相比较现今的计算机使用二进制数字系统更接近人类大脑的思维方式 二进制计算规则非常简单但并不能完全表达人类想法 在一般情况下 命题不一定为真或假 还可能为未知 在三进制逻辑学中
  • 折半查找算法 ,又称二分查找。(C语言)

    分析 此题目的是找到k 7的数 k的值可随便更改 如果数组中没有k对应的值 则找不到这个数字 并且输出查找次数 代码 include
  • Django 项目部署

    Django 项目部署 1 概述 将开发完成的 Django 项目部署到指定的服务器上 而服务器的系统基本都是 linux Django 项目当前最主要的部署方式是 Python Django Nginx uWSGI python 是 py