赞
踩
我们前面编写的所有代码都是在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 别和应用名称那层搞混了)
vi Django_demo/Django_demo/settings.py
- #允许访问的权限
- ALLOWED_HOSTS = ['*','localhost','127.0.0.1']
-
-
-
- #添加导入应用
- INSTALLED_APPS = [
- ...
-
- 'gunicorn', #新增
-
- ]
-
-
-
- #修改
- DEBUG = False #改成False

这里我们需要将原先的项目拷贝一份出来,新的项目的名称自定义,我这里直接定义为paas了
migrations 是存放我们orm转换的python到数据库的配置,如果不删除,可能会影响生产环境
- paas/mgr/migrations
- paas/paas/migrations
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', # 数据库密码
- }
- }
我这边懒得装第二套数据库了,直接用原先的数据
生产环境,我们使用 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 &
- #导出依赖
- pip freeze > requirements.txt
我们为了提供django的性能在他前面使用Gunicorn去部署
另外需要按照一些依赖的库gevent 和 greenlet (异步模式需要)
vi requirements.txt
- #添加
- Gunicorn
- gevent
- greenlet
- mkdir /apps/demo/{web,app}
-
- cd /apps/demo/web
- 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暴露的端口
bysms_front_v1.5
- 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
- #这个是访问nginx下的
- http://101.43.156.78:30019/mgr/sign.html
- cd /apps/demo/app
-
- #将我们整个paas项目扔进去
- 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"]
docker build . -f Dockerfile -t python:v1
- docker run -itd --name paas-app \
- -p 30021:8000 \
- docker.io/library/python:v1
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可能有问题,稍后修改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。