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,oscwd = os.getcwd()
sys.path.append(cwd)

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

vi paas/run.sh

#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"
echo $DIRcd $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 serverkeepalive 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:3COPY  ./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.shCMD ["./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 createsuperuserbyhy
12345678

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11-13 周一 同济子豪兄CNN卷积神经网络学习记录

11-13 周一 同济子豪兄CNN卷积神经网络学习记录 时间版本修改人描述2023年11月13日14:02:14V0.1宋全恒新建文档2023年11月13日19:05:29V0.2宋全恒完成 大白话讲解卷积神经网络的学习 简介 为了深入理解CNN,进行B站 同济子豪兄深度学习之卷积神经网络的学习. 主要内…

Halcon WPF 开发学习笔记(3):WPF+Halcon初步开发

文章目录 前言在MainWindow.xaml里面导入Halcon命名空间WPF简单调用Halcon创建矩形简单调用导出脚本函数 正确显示匹配效果 前言 本章会简单讲解如何调用Halcon组件和接口,因为我们是进行混合开发模式。即核心脚本在平台调试,辅助脚本C#直接调用。 在M…

实验一 Anaconda安装和使用(Python程序设计实验报告)

实验一 Anaconda安装和使用 一、实验环境 Python集成开发环境IDLE/Anaconda 二、实验目的 1.掌握Windows下Anaconda的安装和配置。 2. 掌握Windows下Anaconda的简单使用,包括IDLE、Jupyter Notebook、Spyder工具的使用。 3. 掌握使用pip管理Python扩展库…

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

【入门Flink】- 08Flink时间语义和窗口概念

Flink-Windows 是将无限数据切割成有限的“数据块”进行处理,这就是所谓的“窗口”(Window)。 注意:Flink 中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间范围的数据达到时,才创建对应的窗…

IDEA 关闭SpringBoot启动Logo/图标

一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…

OpenCV:图像噪点消除与滤波算法

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

【hcie-cloud】【3】华为云Stack规划设计之华为云Stack交付综述【上】

文章目录 前言华为云Stack交付综述交付流程华为云Stack交付流程华为云Stack安装部署流程 交付工具链华为云Stack交付工具链eDesigner - 让解决方案销售更智能eDesigner配置页面 - 基本信息eDesigner配置页面 - 服务及组网配置eDesigner配置页面 - 弹性云服务器/ECSeDesigner配置…

带头双向循环链表

文章目录 概述初始化销毁插入删除遍历打印 概述 带头双向循环链表&#xff1a;结构最复杂&#xff0c;一般用在单独存储数据。实际中使用的链表数据结构&#xff0c;都是带头双向循环链表。另外这个结构虽然结构复杂&#xff0c;但是使用代码实现以后会发现结构会带来很多优势…

11.读取文件长度-fseek和ftell函数的使用

文章目录 简介1. 写入测试文件2. 读取文件长度 简介 主要讲使用fopen读取文件&#xff0c;配合使用fseek和ftell来读取文件长度。1. 写入测试文件 执行下方程序&#xff0c;使用fwrite函数写入40字节的数据&#xff0c;使其形成文件存入本地目录。#define _CRT_SECURE_NO_WARNI…

CCF ChinaSoft 2023 论坛巡礼 | 编译技术与编译器设计论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

JVS低代码表单自定义按钮的使用说明和操作示例

在普通的表单设计中&#xff0c;虽然自带的【提交】、【重置】、【取消】按钮可以满足基本操作需求&#xff0c;但在面对更多复杂的业务场景时&#xff0c;这些按钮的显示控制就显得有些力不从心。为了更好地满足用户在表单操作过程中的个性化需求&#xff0c;JVS低代码推出了表…

接口测试--知识问答

1 做接口测试当请求参数多时tps下降明显&#xff0c;此接口根据参数从redis中获取数据&#xff0c;每个参数与redis交互一次&#xff0c;当一组参数是tps5133&#xff0c;五组参数是tps1169&#xff0c;多次交互影响了处理性能&#xff0c;请详细阐述如何改进增进效果的方案。 …

软件外包开发的需求表达方法

软件开发需求的有效表达对于项目的成功至关重要。无论选择哪种需求表达方法&#xff0c;清晰、详细、易于理解是关键。与开发团队建立良好的沟通渠道&#xff0c;确保他们对需求有充分的理解&#xff0c;并随着项目的推进及时调整和更新需求文档。以下是一些常用的需求表达方法…

Django下的Race Condition漏洞

目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包&#xff1a;GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…

【Linux】虚拟机连不上外网 (ping www.baidu.com不通)

进入linux系统&#xff0c;打开终端&#xff0c;ping www.baidu.com 发现ping不通 首先我连接的是nat模式 查看是否连接上自己本机的网 切换root用户 使用 ifconfig 命令查看是eth0 还是 ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTOstatic ONBOOTyes …

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

文章目录 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程122.1 创建并执行涉及加密列的函数/存储过程 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程 密态支持函数/存储过程当前版本只支持sql和P…

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式&#xff0c;想要退出只读模式&#xff0c;但是只读模式是带有密码的&#xff0c;该如何取消带有密码的excel只读文件呢&#xff1f; 带有密码的只读模式&#xff0c;是设置了excel文件的修改权限&#xff0c;取消修改权限&#xff0c;我们需要…

2.7 CE修改器:多级指针查找

在本步骤中&#xff0c;你需要使用多级指针的概念来查找健康值真正的地址并修改它。多级指针就是一个指针的指针&#xff0c;也就是第一个指针指向第二个指针&#xff0c;第二个指针指向第三个指针&#xff0c;以此类推&#xff0c;最终指向你想要访问的地址。 首先&#xff0…

MAC在Linux上上传本地文件压缩包(tomcat)解决方法(炒鸡详细)

要将文件压缩包上传到Linux云服务器&#xff0c;并在服务器上解压打开&#xff0c;你可以使用以下步骤&#xff1a; 在本地的Mac上&#xff0c;将要上传的文件或文件夹压缩成一个压缩包&#xff08;如zip或tar.gz格式&#xff09;。 使用SSH连接到Linux云服务器。你可以使用Te…