Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的,因为我们还处于开发阶段

当我们完成具体任务开发后,就需要把我们开发的网站服务发布给真正的用户

通常来说我们会选择一台公有云服务器比如阿里云ecs,现在的web服务通常都是基于liunx操作系统的

一、架构说明

我们把上线程序并不是简单的把windows的程序仍到linux上运行即可,还需要考虑两个点

1、Django 在生产环境不应该处理静态资源(比如网页、图片等)的请求
   #前面使用了html作为模板返回,或者直接用templates返回前端页面的
   #return render(index.html) 在这种方法是不可取的, django更多的使用json返回数据
   #而碰到这种静态请求时,我们会在前面搭建一台nginx来进行访问,django只接受动态请求


2、Django 在生产环境 不能直接处理 HTTP请求
   #Django是wsgi web application 的框架,它只有一个简单的单线程 wsgi web server供调试时使用,性能很低。

 在生产环境必须提供 专业的 wsgi web server,比如 uWSGI 或者 Gunicorn。 我们这里使用 Gunicorn。

而且即使有了 uWSGI 或者 Gunicorn,我们最好还要在前面设置 Nginx 。所有的客户请求由它先接受,再进行相应的转发。

架构图

Nginx 在整个后端的最前方, 可以实现 负载均衡、反向代理、请求缓存、响应缓存 、负荷控制等等一系列功能。可以大大的提高整个后端的性能和稳定性。

 架构子系统协同分析

1、nginx  
   #Nginx 运行起来是多个进程, 接收从客户端(通常是浏览器或者手机APP)发过来的请求
   #它会根据请求的URL进行判断, 如果请求的是静态资源, 比如HTML文档、图片等
   #它直接从配置的路径进行读取, 返回内容给客户端
   #如果请求的是动态数据, 则转发给Gunicorn+Django进行处理


2、Gunicorn/Django
    #Gunicorn和Django是运行在同一个 Python进程里面的, 它们都是用Python代码写的程序。
    #启动Gunicorn的时候,它会根据配置加载Django的入口模块,这个入口模块里面提供了WSGI接口。
    #当Gunicorn接收到Nginx转发的HTTP请求后, 就会调用Django的WSGI入口函数,将请求给Django进行处理
    #Django框架再根据请求的URL和我们项目配置的URL路由表,找到我们编写的对应的消息处理函数进行处理。
    #我们编写的消息处理函数,就是前面章节大家学习到的,处理前端请求。如果需要读写数据库,就从MySQL数据库读写数据。

二、产品发布包准备

      如果需要你负责产品发布时,你需要准备发布的产品包,而产品包不是说让你把代码打个zip包就完事了,产品通常会设计好几个子系统

       前端通常包含web前端、app前端,而后端也包括业务处理系统、数据库系统、消息队列、异步任务系统、缓存系统等等,

       为了保证这些子系统能在生产环境 友好配合 , 需要仔细的规划、配置、产生发布包

关于前端发布包和后端发布包

首先, 我们现在的系统包括
1、web前端系统(包括web前端的HTML、css、图片、js业务代码、js库等文件)
2、后端业务处理系统

3、数据库系统
 

以上都需要做到产品发布包里面,不同的运营架构,部署的方式不同,需要构建发布包的方式也不同,这里,根据我们的架构图,可以把 前端系统代码 做在一个发布包中, 后端系统做在另一个发布包中

    我们完全可以 把 前后端系统 分别部署到 两台 Linux主机上。当有请求需要Django后端业务系统处理的时候,转发给Django所在的主机即可。 如果请求只是获取一些静态资源

   比如HTML、图片等,在前端主机处理完即可。 这样做到部署的前后端分离。目前我们先按照简单的来, 根据我们的架构图, 都部署在同一台机器上

三、前端产品包准备

前端发布包,由前端开发人员提供,在如下百度网盘中的 bysms_front_v1.5.zip,大家先下载到本地

百度网盘链接:https://pan.baidu.com/s/1nUyxvq6IYykBNtPUf4Ho6w

提取码:9w2u

四、后端产品包准备

作为后端的开发人员,当然由我们来提供后端的发布包

(注意: 我这里的项目名称是Django_demo  别和应用名称那层搞混了)

1、添加项目权限及导入Gunicorn 功能

vi Django_demo/Django_demo/settings.py

#允许访问的权限
ALLOWED_HOSTS = ['*','localhost','127.0.0.1']



#添加导入应用
INSTALLED_APPS = [
...

    'gunicorn',   #新增

]



#修改
DEBUG = False   #改成False

2、拷贝项目

这里我们需要将原先的项目拷贝一份出来,新的项目的名称自定义,我这里直接定义为paas了

3、删除拷贝项目中数据库配置

migrations 是存放我们orm转换的python到数据库的配置,如果不删除,可能会影响生产环境

paas/mgr/migrations
paas/paas/migrations

4、修改数据库配置为生产环境

paas/Django_demo/settings.py

DATABASES = {
    'default':
        {
            'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
            'NAME': 'paas', # 数据库名称
            'HOST': '101.43.156.78', # 数据库地址
            'PORT': 30013, # 端口
            'USER': 'root',  # 数据库用户名
            'PASSWORD': '123456', # 数据库密码
        }
}

我这边懒得装第二套数据库了,直接用原先的数据

5、添加linux启动脚本

生产环境,我们使用 Gunicorn 作为 Django的WSGI前端,首先我们需要创建一个 Gunicorn启动配置文件  paas/gunicorn_conf.py ,内容如下

 paas/gunicorn_conf.py

# gunicorn/django  服务监听地址、端口
bind = '0.0.0.0:8000'

# gunicorn worker 进程个数,建议为: CPU核心个数 * 2 + 1
workers =  3 

# gunicorn worker 类型, 使用异步的event类型IO效率比较高
worker_class =  "gevent"  

# 日志文件路径
#errorlog = "/home/gunicorn.log"
errorlog = "-"
loglevel = "info"

import sys,os

cwd = os.getcwd()
sys.path.append(cwd)

要保证我们的Django后端服务在linux上一个命令就能启动,需要开发一个 Linux 启动shell脚本 ./run.sh

vi paas/run.sh

#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"
echo $DIR

cd $DIR

# ulimit -n 50000
#这里就是指定一下我们定义的配置文件
#Django_demo.wsgi  就是我们这个项目的项目名称+ .wsgi就行
gunicorn --config=$DIR/gunicorn_conf.py Django_demo.wsgi 

#后台运行用下面这个
#nohup gunicorn --config=$DIR/gunicorn_conf.py Django_demo.wsgi &> /dev/null &

6、导出本地环境使用的库

#导出依赖
pip freeze > requirements.txt

我们为了提供django的性能在他前面使用Gunicorn去部署

另外需要按照一些依赖的库gevent 和 greenlet (异步模式需要)

vi requirements.txt

#添加
Gunicorn
gevent
greenlet 

7、整理路径

五、部署nginx环境

mkdir /apps/demo/{web,app}

cd /apps/demo/web

1、添加nginx配置文件

vi nginx.conf

user  nginx;          # 用byhy用户运行Nginx进程
worker_processes  2; # 启动两个Nginx worker 进程

events {
    # 每个工作进程 可以同时接收 1024 个连接
    worker_connections  1024;
}

# 配置 Nginx worker 进程 最大允许 2000个网络连接
worker_rlimit_nofile 2000;

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

    sendfile        on;

    keepalive_timeout  30;

    gzip  on;

    # 配置 动态服务器(比如Gunicorn/Django)
    # 主要配置 名称(这里是apiserver) 地址和端口
    upstream apiserver  {

        # maintain a maximum of 20 idle connections to each upstream server
        keepalive 20;

        server 10.0.16.15:30021; # 地址和端口
    }

    # 配置 HTTP 服务器信息
    server {
        # 配置网站的域名,这里请改为你申请的域名, 如果没有域名,使用IP地址。
        server_name  10.0.16.15;

        # 配置访问静态文件的根目录,
        root /home/byhy/bysms_frontend/z_dist;

        # 配置动态数据请求怎么处理
        # 下面这个配置项说明了,当 HTTP 请求 URL以 /api/ 开头,
        # 则转发给 apiserver 服务器进程去处理
        location /api/      {
            proxy_pass         http://apiserver;
            proxy_set_header   Host $host;
        }
    }

}

上面的配置文件中,我们定义了如果请求/api/ 就把请求交给10.0.16.15:30021端口,这个是一会我们搭建django暴露的端口

2、添加前端包

bysms_front_v1.5

 

3、启动nginx

docker run -itd --name test  \
    -v ./nginx.conf:/etc/nginx/nginx.conf \
    -p 30019:80 \
    -v ./bysms_front_v1.5:/home/byhy/bysms_frontend/ \
    nginx

4、测试

#这个是访问nginx下的
http://101.43.156.78:30019/mgr/sign.html

六、部署后端环境

1、上传后端包

cd /apps/demo/app

#将我们整个paas项目扔进去

 

2、编写Dockerfile

FROM python:3

COPY  ./paas /home/paas/
WORKDIR /home/paas/

RUN python3 -m pip config set global.index-url  https://pypi.douban.com/simple/ \
    && python3 -m pip config set global.trusted-host pypi.douban.com \
    && pip3 install -r requirements.txt \
    && chmod +x run.sh

CMD ["./run.sh"]

3、构建镜像

docker build . -f Dockerfile -t python:v1

4、运行

docker run -itd --name paas-app \
 -p 30021:8000 \
 docker.io/library/python:v1

5、测试

http://101.43.156.78:30019/api/mgr/orders/?action=list_order

七、创建用户

#登录容器
docker exec -it paas-app bash

#写入django数据库表数据
python3 manage.py makemigrations
python3 manage.py migrate 

#创建用户 
python3 manage.py createsuperuser


byhy
12345678

流程基本就是这样,上面前端的代码调用的后端的api可能有问题,稍后修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124860.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车,搭载3.0L发动机,累计行驶里程约为3.8万km。车主反映,车辆在行驶过程中突然出现发动机抖动且加速无力的现象,于是请求拖车救援。 二、故障诊断 拖车到店后首先试车,发动机怠速轻微抖…

Unity地面交互效果——5、角色足迹的制作

大家好,我是阿赵。   之前几篇文章,已经介绍了地面交互的轨迹做法。包括了法线、曲面细分还有顶点偏移。Shader方面的内容已经说完了,不过之前都是用一个球来模拟轨迹,这次来介绍一下,怎样和角色动作结合&#xff0c…

深入浅出理解ResNet网络模型+PyTorch实现

温故而知新,可以为师矣! 一、参考资料 论文:Identity Mappings in Deep Residual Networks 论文:Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、ResNet20、…

文件夹重命名:解决文件夹名称难题,批量将中文翻译成英文

在日常生活和工作中,我们经常需要处理各种各样的文件和文件夹。然而,有时候我们会遇到文件夹名称混乱或者无法识别的问题,这给我们的文件管理和查找带来了很大的不便。为了解决这些问题,我们可以使用文件夹批量重命名技巧&#xf…

strtok函数详解:字符串【分割】的利器

目录 一,strtok函数简介 二,strtok函数的用法 三,strtok函数的注意事项 一,strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割,从而得到我们想要的子字符串。 🍂函数头文件&am…

前端工程化(vue脚手架安装)

用命令行安装,先安装NodeJs,配置环境变量 1.npm config set prefix "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js" //引号内路径是NodeJs安装所在路径 2.npm config get prefix 查看其是否成功 3.npm install -g vue/cli 4…

MySQL数据库入门到大牛_05_排序ORDER BY与分页LIMIT

文章目录 1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 3. 第五章练习 1. 排序数据 1.1 排序规则 如果没有使用排序操作,默认情况下,查询返回的数据是按照添加数据的顺序显示。例如:在淘宝中可以…

【Vue】组件封装小技巧 — 利用$attrs和v-bind接收传递未定义的属性

使用介绍 在Vue.js中,$attrs 和v-bind可以用于组件的二次封装,以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码: 假设你有一个名为MyButton的自定义按钮组件,它接受一些…

14.序列化和文件的输入/输出 保存对象

14.1 保存对象状态 你已经奏出完美的乐章,现在会想把它储存起来。你可以抓个文房四宝把它记下来,但也可以按下储存按钮(或按下File菜单上的Save)。然后你帮文件命名,并希望这个文件不会让屏幕变成蓝色的画面。 储存状态的选择有很多种&…

域名解析DNS:如何查询txt类型的解析记录

前言 略 查询txt类型的解析记录 使用 nslookup 命令查询。 示例: cmd> nslookup -qttxt _acme-challenge.mydomain.com 服务器: UnKnown Address: fe80::1非权威应答: _acme-challenge.mydomain.com text "_unitrust-dcv2311071423492fmnwb1w…

07 # 手写 find 方法

find 的使用 find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 9];var result arr.find(fun…

第七讲:利用类事件改变对象的属性(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

矿泉水除溴酸盐、矿泉水除溴化物的技术

我们常饮用的各品牌的矿泉水&#xff0c;实际在生产过程当中也涉及到了相当复杂的处理工艺的&#xff0c;今天为大家分享的是关于矿泉水中溴酸盐、溴化物的知识点&#xff0c;以及矿泉水中为什么要除溴酸盐&#xff1f;原理是什么&#xff0c;那么又是什么样的技术能真正从根本…

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

华为防火墙基本原理工作方法总结

防火墙只会对tcp首包syn建立会话表&#xff0c;其它丢掉&#xff0c;如synack&#xff0c;ack udp直接建立会话表 icmp只对首包请求包建立会话表&#xff0c;其它包&#xff0c;如应答的不会建立直接丢掉 防火墙状态查看&#xff1a; rule name trust_untrust source-zone tru…

Qlik Sense : Fetching data with Qlik Web Connectors

目录 Connecting to data sources Opening a connector Connecting to a data source Authenticating the connector Defining table parameters Using standard mode or legacy mode Standard mode Connector overview Using multi-line input parameters to fetch da…

解析虚拟文件系统的调用

Linux 可以支持多达数十种不同的文件系统。它们的实现各不相同&#xff0c;因此 Linux 内核向用户空间提供了虚拟文件系统这个统一的接口&#xff0c;来对文件系统进行操作。它提供了常见的文件系统对象模型&#xff0c;例如 inode、directory entry、mount 等&#xff0c;以及…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

全志A40i应用笔记 | 3种常见的网卡软件问题以及排查思路

在飞凌嵌入式OKA40i-C开发板上虽然只有一个网口&#xff0c;但全志A40i-H处理器本身是有两个网络控制器的&#xff0c;因此在飞凌嵌入式提供的产品资料中提供了双网口解决方案。有的工程师小伙伴在开发过程中会遇见一些网卡的设计问题&#xff0c;今天小编为大家分享3种在使用O…