django生产环境部署

article/2025/8/29 8:57:30

django生产环境部署

生产环境中的数据流

参考文档:

wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323

wsgi协议介绍(萌新版):https://blog.csdn.net/j163you/article/details/80919360

廖雪峰web编程讲解:https://www.liaoxuefeng.com/wiki/897692888725344/923057027806560

WSGI是什么?

  1. WSGI是一种规范,它定义了使用python编写的web app(django)与web server(uWSGI)之间接口格式,实现web app与web server间的解耦。

  2. WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行

  3. WSGI实质:WSGI是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范、协议。

为什么需要web协议:

1)不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

2) 这样,服务器程序就需要为不同的框架提供不同的支持,只有支持它的服务器才能被开发出的应用使用,显然这是不可行的。

3)**web协议本质:**就是定义了Web服务器和Web应用程序或框架之间的一种简单而通用的接口规范。

Web协议介绍

Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi

1. CGI: 最早的协议

2. FCGI: 比CGI快

3. WSGI: Python专用的协议
 4. uwsgi: 比FCGI和WSGI都快,是uWSGI项目自有的协议,主要特征是采用二进制来存储数据,
议都是使用字符串,所以在存储空间和解析速度上,都优于字符串型协议.

uwsgi是什么?

  1. 它是一个二进制协议,可以携带任何类型的数据。
  2. 一个uwsgi分组的头4个字节描述了这个分组包含的数据类型。
  3. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信;

uWSGI是什么?(web服务器 和nginx类似

  1. 什么是uWSGI: uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。

  2. **uWSGI****作用:**它要做的就是把HTTP协议转化成语言支持的网络协议,比如把HTTP协议转化成WSGI协议,让Python可以直接使用。

  3. uWSGI特点:轻量级,易部署,性能比nginx差很多

注:

如果架构是Nginx+uWSGI+APP,uWSGI是一个中间件
  如果架构是uWSGI+APP,uWSGI是一个服务器

WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI是一种通信协议。通常用户django框架和uWSGI服务器之间通信。(如果说的更细致的话就是用来和Python WSGI model)
  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  • 而uWSGI是实现了uwsgi和WSGI等协议的Web服务器

nginx是什么?

1. Nginx是一个Web服务器,其中的HTTP服务器功能和uWSGI功能很类似
 2. 但是Nginx还可以用作更多用途,比如最常用的反向代理、负载均衡、拦截攻击等,而且性能极高

django是什么?

1. Django是一个Web框架,框架的作用在于处理request和 reponse,其他的不是框架所关心的内容。

2. 所以如何部署Django不是Django所需要关心的。

请求处理整体流程

  • nginx接收到浏览器发送过来的http请求,将包进行解析,分析url
  • **静态文件请求:**就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件
  • **动态接口请求:**那么nginx就将请求转发给uWSGI,最后到达django处理

各模块作用

1. **nginx:**是对外的服务器,外部浏览器通过url访问nginx,nginx主要处理静态请求

2. **uWSGI:**是对内的服务器,主要用来处理动态请求

3. **uwsgi:**是一种web协议,接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi

4. **WSGI:**是python专用的web协议,根据请求调用应用程序(django)的某个文件,某个文件的某个函数

5. **django:**是真正干活的,查询数据等资源,把处理的结果再次返回给WSGI, WSGI 将返回值进行打包,打包成uwsgi能够接收的格式

6. uwsgi接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器

Django + uWSGI方案

1. 没有nginx而只有uwsgi的服务器,则是Internet请求直接由uwsgi处理,并反馈到web项目中。

2. nginx可以实现安全过滤,防DDOS等保护安全的操作,并且如果配置了多台服务器,nginx可以保证服务器的负载相对均衡。

3. 而uwWSGI则是一个web服务器,实现了WSGI协议(Web Server Gateway Interface),http协议等,它可以接收和处理请求,发出响应等。所以只用uwsgi也是可以的。

nginx和uWSGI特点

1)nginx的作用

1.反向代理,可以拦截一些web攻击,保护后端的web服务器

2.负载均衡,根据轮询算法,分配请求到多节点web服务器

3.缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用

2)uWSGI的适用

1.单节点服务器的简易部署

2.轻量级,好部署

Django + uWSGI+ Nginx 的生产环境部署

django上线 settings.py 更改配置
在这里插入图片描述
1、在centos 7中安装python3环境

# 1、yum更新yum源
yum update
# 2、安装Python 3.7所需的依赖否则安装后没有pip3包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 3、在官网下载所需版本,这里用的是3.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
# 1、yum更新yum源
yum update
# 2、安装Python 3.7所需的依赖否则安装后没有pip3包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 3、在官网下载所需版本,这里用的是3.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz2、安装Python# 1、解压
tar -xvf Python-3.7.0.tgz#2、配置编译
cd Python-3.7.0
./configure --prefix=/usr/local/python3  # 配置编译的的路径(这里--prefix是指定编译安装的文件夹)
./configure --enable-optimizations  # 执行该代码后,会编译安装到 /usr/local/bin/ 下,且不用添加软连接或环境变量
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3  # 添加软连接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3#3、将/usr/local/python3/bin加入PATH
[root@linux-node1 testProj]# vim /etc/profile
#然后在文件末尾添加
export PATH=$PATH:/usr/local/python3/bin[root@linux-node1 testProj]# source /etc/profile # 修改完后,还需要让这个环境变量在配置信息中生效,执行命令

2、初始化一个django项目

[root@linux-node1 /]# pip3 install django==2.0.4
[root@linux-node1 /]# mkdir /code/
[root@linux-node1 /]# cd /code/
[root@linux-node1 testProj]# django-admin startproject mmcsite
[root@linux-node1 testProj]# cd /code/mmcsite
[root@linux-node1 testProj]# python3 manage.py runserver 0.0.0.0:8000
# 页面中访问:http://192.168.56.11:8000/

3、安装uWSGI 并使用uWSGI启动这个服务

'''1. 安装uwsgi'''
[root@linux-node1 /]# pip3 install uwsgi
[root@linux-node1 /]# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi'''2. 配置uwsgi.ini启动文件'''
[root@linux-node1 /]# vim uwsgi.ini
[uwsgi]
socket = 0.0.0.0:3031
chdir = /code/mmcsite
wsgi-file = /code/mmcsite/wsgi.py
processes = 5
threads = 30
master = true
daemonize = /code/mmcsite/uwsgi.log
module=mmcsite.wsgi
pidfile = /code/mmcsite/uwsgi.pid
chmod-socket=666
enable-threads = true'''3. 使用uwsgi启动django:一定要在这个项目目录中'''
[root@linux-node1 /]# uwsgi --http 192.168.56.11:80 --file mmcsite/wsgi.py --static-map=/static=static
访问项目:http://192.168.56.11

配置uWSGI文件

[root@linux-node2 demo2]# vim /code/mmcsite/uwsgi.ini  # uwsgi.ini文件
[uwsgi]
socket = 0.0.0.0:3031                  # 指定socket监听的地址和端口
chdir = /code/mmcsite                  # 项目路径 
wsgi-file = /code/mmcsite/wsgi.py      # django的wsgi文件路径
processes = 5                          # 启动五个进程
threads = 30                           # 每个进程启动30个线程
master = true
daemonize = /code/mmcsite/uwsgi.log    # 日志存放路径
module=mmcsite.wsgi                    # 使用mmcsite.wsgi模块
pidfile = /code/mmcsite/uwsgi.pid      # uwsgi启动进程id存放路径
chmod-socket=666                       # socket权限
enable-threads = true                  # 允许用内嵌的语言启动线程,这将允许你在app程序中产生一个子线程

使用uwsgi启动django,注意:需要在Django项目中启动

uwsgi --http 0.0.0.0:端口号(自己填) --file 项目名/wsgi.py --static-map=/static=static

访问项目 如:http://192.168.56.11

如果成功,便可以配置nginx了

4、安装配置nginx

安装nginx

'''1. 配置nginx YUM源'''
[root@linux-node1 /] vim /etc/yum.repos.d/nginx.repo
```
[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```
'''2. 安装nginx'''
[root@linux-node1 /] yum -y install nginx

配置nginx

[root@linux-node1 /]# vim /etc/nginx/conf.d/django.conf 
server {listen       8888;server_name  192.168.56.11;client_max_body_size 5M;gzip on;gzip_buffers 32 4K;#压缩在内存中缓冲32块 每块4Kgzip_comp_level 6 ;#压缩级别 推荐6gzip_min_length 4000;#开始压缩的最小长度4bitgzip_types text/plain application/json application/javascript application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;location / {include uwsgi_params;uwsgi_pass 127.0.0.1:3031;uwsgi_ignore_client_abort on;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

5、启动项目

[root@linux-node1 demo2]# systemctl restart nginx   # 开启nginx
[root@linux-node1 demo2]# uwsgi --ini uwsgi.ini     # 启动uwsgi的django项目
# http://192.168.56.11:8888/ 访问项目
[root@linux-node1 demo2]# uwsgi --stop uwsgi.pid    # 关闭uwsgi

channels+django+nginx+daphne部署websocket项目

​ 当你的django项目中使用channels增加了websocket功能的时候,在使用runserver命令启动时,既可以访问http请求,又可以访问websocket请求。但是当你使用uWSGI+nginx的来启动项目的时候,你会发现http请求可用,但是websocket请求永远是404的错误。这是为什么呢?

​ 因为在我们的标准生产环境部署中,使用的事WSGI协议来启动的我们的项目,也就是使用的wsgi.py这个文件来对接的uWSGI服务器。但是我们channels使用的ASGI协议,在我们使用uWSGI来启动项目的时候,关于ASGI的一些配置他就找不到了。这就导致了你所有的websocket请求都是404。在查阅了大量的资料和阅读了官方文档以后终于解决了这个问题。

这个问题的解决有两种方案:
  • 启用uWSGI来处理所有的http请求,另外开启一个daphne服务来处理websocket请求。这样的好处是按照请求类型分流,两种请求方式互不干扰。
  • 另外一种则是启用daphne服务来处理http和websocket这两种请求。在daphne服务内部他会根据请求类型的不同分开处理。让你既可以访问websocket又可以访问http。

安装Daphne

pip install daphne

在setting.py同级的目录下新建一个asgi.py文件

#asgi.py"""
ASGI entrypoint. Configures Django and then runs the application
defined in the ASGI_APPLICATION setting.
"""import os
import django
from channels.routing import get_default_applicationos.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()
application = get_default_application()
使用Daphne来启动项目

daphne -b 0.0.0.0 -p 8001 myproject.asgi:application

这种方式只是在后台启动了你的项目,我们为了保证项目的稳定性,保证项目在意外死亡以后可以迅速的重启,我们来使用supervisor来管理我们的daphne服务。

什么是supervisor

  1. Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。

  2. 作用:它可以很方便的监听、启动、停止、重启一个或多个进程。

  3. 用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起

  4. 很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

  5. 说白了,它真正有用的功能是俩个将非daemon(守护进程)程序变成deamon方式运行对程序进行监控,当程序退出时,可以自动拉起程序。

  6. 但是它无法控制本身就是daemon的服务。

安装supervisor

yum install epel-release

yum install supervisor

不要使用pip下载supervisor,因为系统有python2.7和python3.6两个版本,有时候会因为版本问题倒是supervisor启动错误。而且pip的supervisor的安装和使用方式也更为繁琐一些。

使用supervisor

在/etc/supervisord.d/文件夹下面配置被管理的服务的配置,然后启动supervisor即可管理该服务。

下面使用supervisor来管理我们dephne服务

#shiyanlou.ini[program:asgi]
directory=/code/shiyanloupro/
command=daphne -b 0.0.0.0 -p 8000 --proxy-headers shiyanloupro.asgi:application
autostart=true
autorestart=true
stdout_logfile=/tmp/websocket.log  #日志
redirect_stderr=true

supervisore的管理命令

[root@linux-node1 tmp]# supervisord -c /etc/supervisord.conf  # 启动supervisor
[root@linux-node1 tmp]# systemctl enable supervisord    # 开机自启动
[root@linux-node1 tmp]# systemctl start supervisord     # 启动supervisord服务
[root@linux-node1 tmp]# supervisorctl reread				    # 重新读取多有的配置文件
[root@linux-node1 tmp]# supervisorctl update            # 配置文件修改后使用该命令加载新的配置,常和reread连用
[root@linux-node1 tmp]# supervisorctl reload            # 重新启动配置中的所有程序[root@linux-node1 tmp]# supervisorctl status            # 查看supervisor管理的所有进程状态
[root@linux-node1 supervisord.d]# supervisorctl restart test            # 启动test程序
[root@linux-node1 supervisord.d]# supervisorctl stop all                # 停止所有程序
[root@linux-node1 supervisord.d]# supervisorctl stop es       # 停止名称es程序(如果停止所有换成all)
[root@linux-node1 tmp]# supervisorctl start es      # 启动项目名称es程序

接下来就是配置nginx将请求转发发哦daphne服务器

upstream channels-backend {server localhost:8000;
}
...
server {...location / {try_files $uri @proxy_to_app;}...location @proxy_to_app {proxy_pass http://channels-backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Host $server_name;}...
}

接下来开启你的nginx服务和dephne服务即可。

systemctl restart nginx   #重启nginx
supervisorctl reread			#重新读取supervisor的配置
supervisorctl update			#更新supervisor的配置
supervisorctl start asgi	#启动asgi服务,也就是我们的daphne服务

http://chatgpt.dhexx.cn/article/L6a5D380.shtml

相关文章

开发环境、测试环境、生产环境 到底是什么?

读一些官方文档的时候,总会遇到以下几个关键的名词,一开始我不太懂,绕来绕去,让我对文档阅读产生了误会,于是查找了一些资料。 百度解释如下: 开发环境:开发环境是程序猿们专门用于开发的服务器…

生产环境和开发环境

开发环境(development) 开发环境: 是指程序猿专门用于开发的服务器,配置比较简单随意,主要是为了开发过程中调试方便,一般打开全部错误报告和测试工具。 生产环境:(production&…

postman接口自动化测试

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动     想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中&#xf…

接口自动化测试:Postman实战教程

01 接口测试 (1)服务器端(server):在使用别人的服务器上,例如微信APP客户端,服务端在腾讯的服务端上,微信上的账号信息,聊天记录均存储在服务端上;用户A发送…

APITest接口自动化测试平台

接口自动化测试平台 环境 JAVA 1.8 MYSQL 测试管理平台为 war(SpringSpringMVCMaven) 定时执行为 jar(SpringMaven) ps:该项目测试管理平台(包括用例调试)与定时执行是分开的,可分开…

全网最全,接口自动化测试怎么做的?精通接口自动化测试详解

目录:导读 一、前言二、接口自动化测试的 "能 "1、接口自动化的目标2、接口自动化 Case 用例设计原则3、接口自动化用例定时跑 三、接口自动化测试的 "不能 "1、接口自动化之难点2、接口自动化之痛点 一、前言 接口通俗来讲就是前端和后段之间…

接口自动化测试框架搭建

一、原理及特点 参数放在XML文件中进行管理用httpClient简单封装一个httpUtils工具类测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。测试报告这里用到第三方的包ReportNG 项目组织用Maven 二、准备 使用工具&#xff1…

接口自动化测试实践指导(下):接口自动化测试断言设置思路

在前篇文章: 接口自动化测试实践指导(中):接口测试场景有哪些 中详细给小伙伴们讲解了一下接口自动化需要做哪些准备工作及接口测试场景有哪些。 本篇文章是最后一篇,主要分享一下接口自动化测试断言设置思路。 如…

Apifox接口自动化测试方法

1.新建测试用例 2.输入名称、分组、优先级后点击确定 3.点击测试用例名称或者详情 4.添加步骤,两个方式都可以 5.选择要测试的接口后选择模式,复制/绑定,复制-复制一份数据,和原来的接口相互独立,互不影响&…

接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…

如何搭建接口自动化测试框架?

为什么要做(自动化)接口测试? 1、由于现在各个系统的复杂度不断上升,导致传统的测试方法成本上升且测试效率大幅下降,而接口测试相对于UI测试更加稳定,且相对容易实现自动化持续集成,可以减少人…

接口自动化测试实践指导(上):接口自动化需要做哪些准备工作

作者:石臻臻, CSDN博客之星Top5、Kafka Contributor 、nacos Contributor、华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家 、 LogiKM PMC(改名KnowStream)。 LogiKM(改名KnowStreaming) 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不…

pytest接口自动化测试框架搭建

文章目录 一. 背景二. 基础环境三. 项目结构四、框架解析4.1 接口数据文件处理4.2 封装测试工具类4.3 测试用例代码编写4.4 测试用例运行生成报告 一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多的文章讲述相关的知识。最近自己也…

接口自动化测试项目实战

目录 1. 什么是接口测试 2. 基本流程 2.1 示例接口 3. 需求分析 4. 用例设计 5. 脚本开发 5.1 相关lib安装 5.2 接口调用 5.3 结果校验 5.4 执行测试 5.5 发送邮件报告 6. 结果分析 7. 完整脚本 8、总结 1. 什么是接口测试 顾名思义,接口测试是对系统或…

接口自动化测试用例详解

phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调用,但是可以用Curl命令的-d参数传递接口需要的参数。当然我们还以众筹网的登录接口为例,讲…

接口自动化测试流程

文章目录 接口自动化测试的基本流程一、需求分析二、自动化接口挑选三、设计自动化测试用例四、搭建自动化测试环境五、设计自动化执行框架六、编写代码七、执行用例八、测试报告 接口自动化测试的基本流程 1、需求分析 2、挑选需要做自动化测试的功能接口 3、设计测试用例 4、…

接口自动化测试框架

本文介绍一个接口自动化测试框架。 Pythonunittestrequests 实现结果:读取Excel接口测试用例并执行,输出测试报告。 框架脑图 如图,各个模块及作用如上。 处理数据库 db_funcs用来处理数据库,实现数据库数据的读取操作。&…

基于 python 的接口自动化测试,让你轻松掌握接口自动化

目录 目录 一、简介 ​编辑二、引言 三、环境准备 四、测试接口准备 接口信息 五、编写接口测试 六、优化 封装接口调用 一、简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势; 然后简单讨论了一下接口测试框架的要点&#xff…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试,其实也是一种功能测试,只是平时大家说的功能测试更多代指 UI 层面的功能测试,而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移,尽早介入测试&#…

接口自动化测试【完整版】

1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…