一、架构说明

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


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

架构图

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

 架构子系统协同分析

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数据库读写数据。

二、产品发布包准备

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

三、前端产品包准备

四、后端产品包准备

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

vi Django_demo/Django_demo/settings.py

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



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

    'gunicorn',   #新增

]



#修改
DEBUG = False   #改成False

2、拷贝项目

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

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

paas/mgr/migrations
paas/paas/migrations

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

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启动脚本

 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)

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

vi requirements.txt

#添加
Gunicorn
gevent
greenlet 

7、整理路径

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

五、部署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;
        }
    }

}

2、添加前端包

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

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项目扔进去

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

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

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

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

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

七、创建用户

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

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

#创建用户 
python3 manage.py createsuperuser


byhy
12345678
11-10 18:45