Django部署时为什么要用 uWSGI与 Nginx? 以及 WSGI,uwsgi等协议

Posted luo大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django部署时为什么要用 uWSGI与 Nginx? 以及 WSGI,uwsgi等协议相关的知识,希望对你有一定的参考价值。

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? 以及 WSGI,uwsgi等协议的主要内容,如果未能解决你的问题,请参考以下文章

详解django+Nginx+uwsgi 云服务器项目部署

Ubuntu下Django部署nginx+uwsgi

Ubuntu下Django部署nginx+uwsgi

django+nginx+uwsgi部署web站点

一篇搞懂nginx与Django部署

使用uWSGI部署django项目