古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。

浅析Nginx+uWSGI+Django原理

Python admin 1802℃ 0评论

当前Python Web开发框架中基本上是Django一家独大,当然也有Flask、bottle等框架分庭抗礼,后续可能专门开一章汇总一下各框架的特点和选型建议。

使用Django框架开发部署时,一般都会选择Nginx+uWSGI+Django(推荐阅读)这样成熟稳定的服务器架构,原因是什么呢,我们单纯使用Django自带的WSGI Server (runserver方法,主要用于调试)或者uWSGI+Django来启动服务器为什么就不行呢?

在分析原因之前,我们首先要复习几个名词和概念:

  • APP(即应用程序):是开发者编写的程序,例如本文讨论的Django应用,它记录了处理客户端请求的执行逻辑;
  • WSGI:是一个协议,Python用于Web开发的协议;
  • uWSGI:是一个程序,充当Web服务器或者中间件;
    • 如果架构是Nginx+uWSGI+APP,uWSGI就是一个中间件;
    • 如果架构是uWSGI+APP,uWSGI就是一个服务器;
  • uwsgi:是uWSGI程序实现的一个自有协议;

上面介绍了很多协议,也来简单复习一下Web协议出现发展的历史,即 CGI-> FCGI -> WSGI -> uwsgi。

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

一、WSGI协议

浏览器请求一个页面的流程:

  1. 浏览器发送请求给服务器,包含请求头和请求体
  2. 服务器解析请求头和请求体
  3. 服务器根据请求信息来处理请求,生成返回内容
  4. 服务器生成响应头和响应体
  5. 服务器返回响应给浏览器,浏览器显示给用户

一个网站,一般有很多个不同的请求,在这些请求中,基本1,2,4,5部都是固定的,变的只有第三步,所以把这四步抽象出来,让开发者只关注第三步,这样就可以极大提升开发效率。所以WSGI协议诞生了。WSGI,全称 Web Server Gateway Interface。是Python专用的协议,其他语言没有。用于处理Web服务器和应用程序(APP)的交互信息。很多Web框架(如:django)都会自带WSGI服务器,但是性能不好,只作测试用途。

二 CGI和FastCGI

CGI是Common Gateway Interface,即通用网关接口,是一个协议,是外部应用程序(CGI程序)与Web服务器之间的接口标准。该协议定义了Web服务器在调用应用程序时需要传输的参数和应用程序怎么返回结果给Web服务器,其实跟WSGI类似。CGI的一个特点是,对于每一个HTTP请求,Web服务器都会新建一个进程(fork),等应用程序返回结果后,这个进程就会结束。这样的后果是,一旦HTTP请求多的时候,Web服务器会频繁创建进程,大家都知道,创建进程的开销是非常大的,所以这种做法会影响服务器的性能,所以就有了FastCGI。FCGI的做法是在Web服务器启动的时候,就创建多个应用程序进程,当Web服务器接收到HTTP请求时,就把请求分发给其中一个空闲的进程。相当于MYSQL连接池的原理。这样就可以避免频繁地fork进程。FCGI另一个特点是支持分布式,也就是Web服务器和应用程序可以在不同的机器。

CGI和WSGI的区别是

  • CGI的出现更加早,这个是通用的接口,应用程序可以是JAVA,Python,等多种语言程序
  • WSGI是Python专用的,在CGI的基础上改进的协议;

三 Nginx

Ningx是一个反向代理服务器,那么什么是反响代理呢,之前的文章“经典面试题-输入url到页面显示都发生了什么”中已经介绍过了,这里不再赘述,简单总结一下反向代理的作用。

  1. 安全:客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。
  2. 负载均衡:反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
  3. 提升Web服务器的IO性能:一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求,可以直接交给反向代理来处理,不需要经过Web服务器。

Nginx作为一个高性能的HTTP和反向代理服务器,常用的架构就是“ Nginx+uWSGI+APP”这样的模式。

其中Nginx和uWSGI之间可以通过CGI,FCGI和uwsgi协议通信,当然uwsgi的性能是最好的。

四 总结

runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行,主要在测试和开发中使用,并且runserver开启的方式也是单进程。uWSGI 是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。注意 uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的Web服务器。uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用app隔离开,实现真正的部署 。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

  1. uWSGI+Django比单独使用Django的好处:
    • 支持的并发量更高
    • 方便管理多进程,发挥多核的优势
    • 提升性能,因为uwsgi协议比WSGI协议有优势
  2. Nginx+uWSGI+Django 比 uWSGI+Django 优势的点就是反向代理;

参考文献

转载请注明:北凉柿子 » 浅析Nginx+uWSGI+Django原理

喜欢 (0)or分享 (0)

Warning: copy(http://2.gravatar.com/avatar/?s=54&d=http%3A%2F%2Fwww.beiliangshizi.com%2Fwp-content%2Fthemes%2Fyusi1.0%2Fimg%2Fdefault.png&r=g): failed to open stream: HTTP request failed! in /www/wwwroot/www.beiliangshizi.com/wp-content/themes/yusi1.0/functions.php on line 234
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址