Django 项目部署_ASDDAG的博客-程序员秘密_django项目部署

技术标签: python  django  nginx  

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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_50840738/article/details/123947125

智能推荐

Web程序结构_weixin_34337381的博客-程序员秘密

Web程序结构:一个web应用程序是由一组Servlet,HTML页面,类以及其他的资源组成的运行在web服务器上完整的应用程序,以一种结构化的有层次的目录形式存在组成web应用程序的这些文件要部署在相应的目录层次中,根目录代表整个web应用程序的“根”通常将web应用程序的目录放在webapps目录下,在webapps目录下的每一个子目录都是一个独立的...

nfs挂载错误wrong fs type, bad option, bad superblock_wx_doitroot的博客-程序员秘密_bad supperblock

挂载存储,错误提示 在linux中利用nfs挂载硬盘时发现提示wrong fs type, bad option, bad superblock错误了,在网上搜索了一下说是没有安装 mount.nfs了,我们只要安装mount.nfs就不会有wrong fs type, bad option, bad superblock错误提示了哦。 今天碰到一个nfs挂载错误的问题,错误提示如下: [[email protected] ~]# mount -t nfs 10...

Android textview自适应宽度自动调整字体大小_Queen小天的博客-程序员秘密

直接上代码AutofitTextView.Javapublic class AutofitTextView extends TextView implements AutofitHelper.OnTextSizeChangeListener { private AutofitHelper mHelper; public AutofitTextView(Context context) {

C++11之 std::bind | std::function_粪逗er的博客-程序员秘密_c++11 std::bind 对象函数

头文件 #include <functional>命名空间 std、std::placeholders1、bind与function使用示例代码:void showAll(int a, double b, const std::string& c){ std::cout &amp

人工智能药物设计_用AI革新药物安全_weixin_26632369的博客-程序员秘密

人工智能药物设计 介绍 (Introduction)Advances in the life sciences have brought about a transformative impact on healthcare, with life span and quality of life dramatically improving world-wide. Improvements in...

随便推点

文本内容查看(less/cat/tac/more/less/head/tail)_耘田的博客-程序员秘密_cat 会把文件整个拉进内存吗

vi命令是编辑器,但是有个可怕的地方。如果文件很大,好几十G,那么vi一下,则会把所有文件都会加载到内存中。导致服务器瘫痪。 因此查看文件,最好用less,cat,tail命令。less/cat/tac/more/less/head/tail

sudo和chmod命令_清尘大哥的博客-程序员秘密_chmod sudoers

Linux的两个权限命令。一 SUDOSUDO命令可以允许当前普通用户使用root管理员权限进行操作而无需root登录,这样可以减少因root登录而造成的各种不便sudo命令的参数sudo命令包含了许多参数,下面是一些常用参数的说明:sudo -h Help 列出使用方法,退出。  sudo -V Version 显示版本

分布式:2PC,3PC,Paxos,Raft,ISR [转]_antui1957的博客-程序员秘密

本文主要讲述2PC及3PC,以及Paxos以及Raft协议。两类一致性(操作原子性与副本一致性)2PC协议用于保证属于多个数据分片上的操作的原子性。这些数据分片可能分布在不同的服务器上,2PC协议保证多台服务器上的操作要么全部成功,要么全部失败。Paxos协议用于保证同一个数据分片的多个副本之间的数据一致性。当这些副本分布到不同的数据中心时,这个需求尤其强烈。...

Java 心形代码_m0_66411349的博客-程序员秘密

class newYearLove{ public static void main(String[] args){ int i,j; char s[] = new char[]{'N','e','w','Y','e','a','r'}; int index = 0; for(i = 3;i > 0;i --){ for(j = 1; j <= 2*i-1; j++) System.out.print('\0'); for(j = 1;j <= 2*.

【bzoj1318/bzoj1307】【玩具】【max】_sunshinezff的博客-程序员秘密

Description小球球是个可爱的孩子,他喜欢玩具,另外小球球有个大大的柜子,里面放满了玩具,由于柜子太高了,每天小球球都会让妈妈从柜子上拿一些玩具放在地板上让小球球玩。 这天,小球球把所有的N辆玩具摆成一排放在地上,对于每辆玩具i,小球球都会给它涂上一个正整数value[i],以表示小球球对该玩具的喜爱程度,value[i]越小则表示他越喜爱。当然对于两辆不同的玩具u,v(uIn

protues卸载后重新安装教程_Laminaria的博客-程序员秘密_为什么protues卸载重装默认c盘

protues 卸载后重新安装教程protues 安装包百度网盘资源:protues 作为一款强大的仿真软件,因为其强大的元件库广受学生党的喜爱,如果protues 第一次安装失败、或者安装成功后找不到软件、或者无法破解?下面我就分享一下自己的安装心得。如何把protues安装到非C盘打开 protues 安装包按照其他网站上的安装教程安装直至出现下列选项。选择第二个(自定义安装路径...

推荐文章

热门文章

相关标签