zoukankan      html  css  js  c++  java
  • uWSGI、uwsgi、WSGI、之间的关系,为什么要用nginx加uWSGI部署。

    WSGI 协议

    WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等。但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就各为一端,他们之间的行车规范就按照WSGI规则即可。我们现在需要记住,WSGI沟通的双方是wsgi server (比如uWSGI) 要和 wsgi application(比如django )

    wsgi server (比如uWSGI)实现wsgi协议规范的服务器我们叫做wsgi服务器,也就是uWSGI服务器,
    wsgi application(比如django )实现wsgi协议的应用,我们叫做wsgi应用,比如Django,Falsk

    uWSGI

    uWGSI:是一个web服务器,或者wsgi server服务器,他的任务就是接受用户请求,由于用户请求是通过网络发过来的,其中用户到服务器端之间用的是http协议,所以我们uWSGI要想接受并且正确解出相关信息,我们就需要uWSGI实现http协议,没错,uWSGI里面就实现了http协议。所以现在我们uWSGI能准确接受到用户请求,并且读出信息。现在我们的uWSGI服务器需要把信息发给Django,我们就需要用到WSGI协议,刚好uWSGI实现了WSGI协议,所以。uWSGI把接收到的信息作一次简单封装传递给Django,Django接收到信息后,再经过一层层的中间件,于是,对信息作进一步处理,最后匹配url,传递给相应的视图函数,视图函数做逻辑处理......后面的就不叙述了,然后将处理后的数据通过中间件一层层返回,到达Djagno最外层,然后,通过WSGI协议将返回数据返回给uWSGI服务器,uWSGI服务器通过http协议将数据传递给用户。这就是整个流程。

    这个过程中我们似乎没有用到uwsgi协议,但是他也是uWSGI实现的一种协议,鲁迅说过,存在即合理,所以说,他肯定在某个地方用到了。我们过一会再来讨论

    我们可以用这条命令:python manage.py runserver,启动Django自带的服务器,具体叫什么名字,我真不知道(知道的可以留言)。DJango自带的服务器(runserver 起来的 HTTPServer 就是 Python 自带的 simple_server)。是默认是单进程单多线程的,对于同一个http请求,总是先执行一个,其他等待,一个一个串行执行。无法并行。而且django自带的web服务器性能也不好,只能在开发过程中使用。于是我们就用uWSGI代替了。但是uWSGI也不够好,为什么看下图。

    为什么有了uWSGI为什么还需要nginx?

    因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。这时候nginx和uWSGI之间的沟通就要用到uwsgi协议。

     

     杂谈

    django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发

    nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地方,由于其底层使用 epoll 异步IO模型进行处理,使其深受欢迎

    做过运维的应该都知道,

    Python需要使用nginx + uWSGI 提供静态页面访问,和高并发

    php 需要使用 nginx + fastcgi 提供高并发,

    java 需要使用 nginx + tomcat 提供 web 服务

    django 原生为单线程序,当第一个请求没有完成时,第二个请求辉阻塞,知道第一个请求完成,第二个请求才会执行。
    Django就没有用异步,通过线程来实现并发,这也是WSGI普遍的做法,跟tornado不是一个概念
    
    官方文档解释django自带的server默认是多线程
    django开两个接口,第一个接口sleep(20),另一个接口不做延时处理(大概耗时几毫秒)
    先请求第一个接口,紧接着请求第二个接口,第二个接口返回数据,第一个接口20秒之后返回数据
    证明django的server是默认多线程
    
    启动uWSGI服务器
    # 在django项目目录下 Demo工程名
    uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
    经过上述的步骤测试,发现在这种情况下启动django项目,uWSGI也是单线程,访问接口需要
    "排队" 不给uWSGI加进程,uWSGI默认是单进程单线程 uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2 # processes: 进程数 # processes 和 workers 一样的效果 # threads : 每个进程开的线程数
    经过测试,接口可以
    "同时"访问,uWSGI提供多线程
    • Python因为GIL的存在,在一个进程中,只允许一个线程工作,导致单进程多线程无法利用多核
    • 多进程的线程之间不存在抢GIL的情况,每个进程有一个自己的线程锁,多进程多GIL
  • 相关阅读:
    条件语句、循环语句
    var、符号运算、条件语句、三元(目)运算、自加和自减
    js的介绍
    浏览器的差距、ie6 ie7 ie8、符号、html css、BFC、
    单位、浏览器、布局、
    z-index、absolute、marquee滚动条的问题
    js数据类型 方法 函数
    js函数
    全局方法或全局属性
    数据类型
  • 原文地址:https://www.cnblogs.com/biggw/p/11342109.html
Copyright © 2011-2022 走看看