当前位置: 首页 > news >正文

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可能有问题,稍后修改

相关文章:

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

我们前面编写的所有代码都是在windows上面运行的,因为我们还处于开发阶段 当我们完成具体任务开发后,就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs,现在的web服务通常都是基于liunx操作系统…...

Git 服务器上的 LFS 下载

以llama为例: https://huggingface.co/meta-llama/Llama-2-7b-hf Github # 1. 安装完成后,首先先初始化;如果有反馈,一般表示初始化成功 git lfs install ​ # 2. 如果刚刚下载的那个项目没啥更改,重新下一遍&#x…...

Canvas和SVG:你应该选择哪一个?

如果你是一个Web开发者,你可能已经听说过Canvas和SVG。这两种技术都可以用来创建图形和动画,但它们有什么区别?在这篇文章中,我们将探讨Canvas和SVG的区别以及它们的应用场景,帮助你决定哪种技术更适合你的项目。 什么…...

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

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

BEVFormer 论文阅读

论文链接 BEVFormer BEVFormer,这是一个将Transformer和时间结构应用于自动驾驶的范式,用于从多相机输入中生成鸟瞰(BEV)特征利用查询来查找空间/时间,并相应地聚合时空信息,从而为感知任务提供更强的表示…...

Centos批量删除系统重复进程

原创作者:运维工程师 谢晋 Centos批量删除系统重复进程 客户一台CENTOS 7系统负载高,top查看有很多sh的进程,输入命令top -c查看可以看到对应的进程命令是/bin/bash     经分析后发现是因为该脚本执行时间太长,导致后续执…...

VUE组件的生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶…...

【Git系列】Github指令搜索

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【OpenCV】用数组给Mat图像赋值,单/双/三通道 Mat赋值

文章目录 5 Mat赋值5.1 Mat(int rows, int cols, int type, const Scalar& s)5.2 数组赋值 或直接赋值5.2.1 3*3 单通道 img5.2.2 3*3 双通道 img5.2.3 3*3 三通道 img5 Mat赋值 5.1 Mat(int rows, int cols, int type, const Scalar& s) Mat m(3, 3, CV_8UC3,Scalar…...

Doris:读取Doris数据的N种方法

目录 1.MySQL Client 2.JDBC 3. 查询计划 4.Spark Doris Connector 5.Flink Doris Connector 1.MySQL Client Doris 采用 MySQL 协议,高度兼容 MySQL 语法,支持标准 SQL,用户可以通过各类客户端工具来访问 Doris。登录到doris服务器后&a…...

ceph-deploy bclinux aarch64 ceph 14.2.10

ssh-copy-id,部署机免密登录其他三台主机 所有机器硬盘配置参考如下,计划采用vdb作为ceph数据盘 下载ceph-deploy pip install ceph-deploy 免密登录设置主机名 hostnamectl --static set-hostname ceph-0 .. 3 配置hosts 172.17.163.105 ceph-0 172.…...

爬虫项目(13):使用lxml抓取相亲信息

文章目录 书籍推荐完整代码效果书籍推荐 如果你对Python网络爬虫感兴趣,强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧,是每位爬虫开发者的必读之作。详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 完整代码…...

mysql-数据库三大范式是什么、mysql有哪些索引类型,分别有什么作用 、 事务的特性和隔离级别

1. 数据库三大范式是什么? 数据库三大范式是设计关系型数据库时的规范化原则,确保数据库结构的合理性和减少数据冗余。 这三大范式分别是: - **第一范式(1NF):** 数据表中的所有列都是不可分割的原子数据项…...

微信小程序案例3-2 计算器

文章目录 一、运行效果二、知识储备(一)data-*自定义属性(二)模块 三、实现步骤(一)准备工作1、创建项目2、设置导航栏 (二)实现页面结构1、编写页面整体结构2、编写结果区域的结构3…...

QT QSplitter

分裂器QSplitter类提供了一个分裂器部件。和QBoxLayout类似,可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。 比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放到分裂器中就可以被拉伸。还有一点不…...

银行支付凭证截图生成器在线,工商邮政农业招商建设,画板+透明标签+图片框

用易语言设计了一个非常牛X的截图生成器,娱乐使用哈,软件我在这里也不会分享,模版网上找的,百度图库搜到的,上面的LOGO用的是一个在线生成器,然后标签用的黑月透明标签,加一个通用对话框读取图片…...

微服务概述

微服务架构是一种软件设计和开发范式,旨在将大型应用程序分解为一组小而独立的服务单元,这些单元可以独立开发、测试、部署和扩展。每个服务都专注于一个明确定义的业务功能,并通过轻量级的通信机制进行交互。以下是微服务架构的一些关键方面…...

LabVIEW中NIPackageManager功能介绍

LabVIEW中PackageManager功能介绍 使用NIPackage Manager可安装、更新、修复和删除NI软件。 安装NI软件 使用PackageManager浏览和安装NI软件。 1. 在浏览产品选项卡上,单击产品类别以显示该类别中的可用产品。 2. 选择要安装的产品,然后单击…...

【C语言】sem_getvalue

sem_getvalue 是 POSIX 线程库中用于获取信号量当前值的一个函数。信号量(Semaphore)是用于编程中的同步工具,用于管理多个线程或进程对共享资源的并发访问。通常用于限制可以同时访问共享资源的线程数量。函数 sem_getvalue 的声明通常出现在…...

Linux的shell的$# | fi | 说明

$# | fi | 说明 在Linux的Shell脚本中,$# 是一个特殊变量,表示传递给脚本的参数个数。 例如,如果你运行一个脚本并传递了三个参数,那么在脚本内部使用 $# 将会得到 3。这对于确定脚本在执行时接收到了多少个参数是非常有用的。以…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...