【转】Django部署时为什么要用 uWSGI与 Nginx? 以及 WSGI,uwsgi等协议
转自 https://www.cnblogs.com/luodaxia/p/12023492.html
Django框架的服务器架构一般是 Nginx + uWSGI + Django
1 WSGI协议,uwsgi协议
WSGI协议(通讯协议):Python用于Web开发的协议(用于处理Web服务器和应用程序(APP)的交互信息)
(把http通讯的过程抽象出来(请求数据,响应数据的封装),开发者只负责处理中途的数据)
uwsgi协议(传输协议,速度很快):uWSGI程序实现的一个自有的协议(采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上,都更快)
注意:
WSGI是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
Web框架一般都自带wsgi服务器 但是性能不好,只作测试用途。(django--wsgiref)
2 wsgiref模块(django 框架自带)
python提供的,用于测试和学习的简单的WSGI服务器模块。
这个模块监听8000端口,把Http请求,根据WSGI协议,转换application函数中的environ参数,然后调用application函数。
wsgiref会把application函数提供的响应头设置转换为HTTP协议的响应头,把application的返回(return)作为响应体,根据HTTP协议,生成响应,返回给浏览器。
3 uWSGI服务器
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。
4.Django 本身提供了runserver,为什么不能用来部署?而是使用nginx+uWSGI部署?
runserver 方法是调试Django 时经常用到的运行方式,它使用Django 自带的WSGI Server 运行,主要在测试和开发中使用,并且runserver 开启的方式也是单进程。
uWSGI 是一个Web 服务器,它实现了WSGI 协议(web服务网关接口)、uwsgi(线路协议)、http 等协议。注意uwsgi 是一种通信协议,而uWSGI 是实现uwsgi 协议和WSGI 协议的Web 服务器。uWSGI 具有超快的性能、低内存占用和多app 管理等优点,并且搭配着Nginx 就是一个生产环境了,能够将用户访问请求与应用app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。
5 为什么要使用Nginx 来做负载均衡?
Nginx
1 安全(Nginx 作为专业服务器,暴露在公网相对比较安全)
2 能更好地处理静态资源(一些http request header)
3 Nginx也可以缓存一些动态内容Nginx可以更好地配合CDN
4 可以进行多台机器的负载均衡
当然,如果访问量不大,其实也没必要加个Nginx,uWSGI足以胜任。
nginx 和uWISG 服务器之间如何配合工作的?
(1)首先浏览器发起http 请求到nginx 服务器
(2)Nginx 根据接收到请求包,进行url 分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器
(3)如果请求的是动态资源就转交给uwsgi服务器,uwsgi 服务器根据自身的uwsgi 和WSGI 协议,找到对应的Django 框架。
(4)Django 框架下的应用进行逻辑处理后,将返回值发送到uwsgi 服务器,然后uwsgi 服务器再返回给nginx。
(5)最后nginx将返回值返回给浏览器进行渲染显示给用户。
django为什么需要uwsgi和nginx的配合
相信每一个第一次开始做django+nginx+uwsgi
线上部署的朋友都感觉到这个相当的麻烦,各种设置,参数以及报错…
我在刚开始在阿里云centos
服务器上做django的线上部署的时候,总有一个疑惑,我使用这句话不就可以运行django程序了么?
# nohup表示不间断,&表示后台执行,80为外部访问端口
nohup python manage.py runserver 0.0.0.0:80 &
好像已经完成了线上的部署,为什么还需要nginx和uwsgi来配合django
呢?
答案其实很简单:性能不够,安全不够,效率不够
所以我们经常需要uwsgi配合nginx来部署一个web框架(django)。
web开发两大块
web开发的两大块,web服务器和web框架
1.web服务器作用:
1)解析请求报文,调用框架程序处理请求。
2)组织响应报文,返回内容给客户端。
2.web框架的作用:
1)路由分发(根据url找到对应的处理函数) 。
2)在处理函数中进行业务的处理。
服务器和客户端之间的连接靠web服务器来维持,web服务器接收到请求后,将请求以及相关的参数传递给web框架,由框架负责生成内容,并将生成的内容传递给web服务器。
django和nginx属于什么
nginx是web服务器,django是web框架
1.django
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone
through security audits or performance tests. (And that’s how it’s
gonna stay. We’re in the business of making Web frameworks, not Web
servers, so improving this server to be able to handle a production
environment is outside the scope of Django.)
根据django的文档我们可以看到,django的作用只是一个框架,它不是服务器,也不会去关心一些安全问题、HTTP 的性能问题等。
所以我们需要更加专业的 HTTP 服务器。
2.nginx
用来接受客户端请求,建立连接,转发响应的程序。外部浏览器通过设定的url访问nginx,nginx接收到浏览器发送过来的http请求,再进行分析。静态文件请求:
会直接返回在nginx设置的静态文件目录下的浏览器请求的静态文件。动态请求:
那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,转化为wsgi可以接受的格式,并发给wsgi,wsgi 根据请求的要求去调用对应的应用程序的某个文件(某个函数)再进行处理,处理完成后wsgi将将其打包成uwsgi能够接收的格式,交给uwsgi,uwsgi接收后转发给nginx,nginx最终将返回值返回给浏览器。
WSGI,uWSGI,uwsgi是什么呢
1.WSGI
是一种协议,不是任何包不是任何服务器,就和 TCP 协议一样。它定义了 Web 服务器和 Web 应用程序之前如何通信的规范。只要web服务器和web框架满足WSGI协议,它们就能相互搭配使用。
所以WSGI只是一个协议,一个约定,而不是python的模块、框架等具体的功能。
2.uWSGI
本身就是一个便携的 web 服务器,当然也可以做一个连接其他app的中间件,所以我们一般还是在它们前面档一个更加专业的 HTTP 服务器——nginx,也就是上文提到的。仅仅只使用uWSGI的会有性能不够,安全性不够的情况。nginx是经过长时间验证的一个更好的服务器。
3.uwsgi
也是一种协议,适用于uWSGI内部,使用二进制的方法与其他的模块进行通讯。
uwsgi+nginx部署django的好处
1.nginx处理静态资源更加优秀,比django和uwsgi更好。
2.nginx可以优化连接,均衡负载,一个uwsgi有时候是不够用的,当同时访问量达到几百可能就不太行了。
3.提高安全性,程序不能直接被浏览器访问到,而是通过nginx开放某个接口,uwsgi本身是内网接口(127.0.0.0.1),对nginx加上安全限制有利于保护程序。
等等…