uWSGI+Django+Nginx的工作原理流程与部署过程

献给和我一样懵懂中不断汲取知识,进步的人们。

霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光

二、必要的前提

2.1 准备知识

django

一个基于Python的开源web框架,请确保自己熟悉它的框架目录结构。

uWSGI

一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关

nginx

常用高性能代理服务器

wsgi.py

django项目携带的一个wsgi接口文件 如果项目名叫destiny的话,此文件就位于[destiny/destiny/wsgi.py]

2.2 相关资料

wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;

uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。

uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

2.3 项目流程
其实网上很多教程,都是关于uwsgi+nginx部署django的,StackOverflow也有一些解决常见错误的方法,但是部署还是容易出问题,新手难解决。
归根到底是自己不了解整个项目的流程。教程都只教方法,但为什么这样部署,这样部署有什么好处,每个组件都起什么作用却只字不提。致使只要部署稍微有那么一点不同,就无可是从了。
所以说,项目流程和每个组件的用途才是此次部署最重要的部分。

首先客户端请求服务资源, nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析, 如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源, 如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi, wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi, wsgi将返回值进行打包,转发给uWSGI, uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。 *注:不同的组件之间传递信息涉及到数据格式和协议的转换

作用:
1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
2. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

三、安装与配置

首先,确保你已经安装好了nginx并可以正常使用
其次,确保自己安装完成了python,并已经完成了pip的安装。如果没有,请先安装。
接着,别忘了确认自己项目所需的django已经完成安装正常工作
没有的话参考以下命令安装django , 建立一个工程或利用已经写好的工程,打开浏览器,输入部署地址(如::8000/)(或内网ip:8000、或外网ip:8000)测试,确认是否可正常打开浏览。

安装:sudo pip install django==1.10 测试:python manage.py runserver 0.0.0.0:8000

uWSGI+Django+Nginx的工作原理流程与部署过程

上面的工作都完成了,接着安装uWSGI

sudo pip install uwsgi

uWSGI+Django+Nginx的工作原理流程与部署过程

测试uWSGI: 新建文件test.py,写入以下内容

def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0d913b68e8dbb859dd05f194518a777e.html