Nginx+uWSGI+Django原理
- 架构简介:
- 名词概念
- CGI和FastCGI:
- CGI和WSGI的区别
- Nginx
- uWSGI+Django
架构简介:
当前Python Web 开发框架中最常用的是Django
,当然也有flask
,bottle
等等。这里主要介绍一下Django
的服务器架构。
使用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协议的知识点:
Web协议的发展历史是这样的:CGI
->FCGI
->WSGI
->uwsgi
- CGI:最早的协议。
- FCGI: 比CGI快。
- WSGI: Python的专用协议。
- uwsgi: 比FCGI和WSGI都快,是uWSGI项目自有的协议,只要特征是采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上,都优于字符串型协议。
##一、WSGI协议
浏览器请求一个页面的流程如下:
- 1、浏览器发送请求给服务器,包含请求头和请求体
- 2、服务器解析请求头和请求体
- 3、服务器根据请求信息来处理请求,生成返回内容
- 4、服务器生成响应头和响应体
- 5、服务器返回响应给浏览器,浏览器显示给用户
一个web中,一般有很多不同的请求,在这些请求中,上述步骤中,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
Nginx是一个反向代理服务器,什么是反向代理?我们先从三个特点切入:
- 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” 这样的模式。
在此文章我们介绍的APP就是Django:
其中Nginx和uWSGI之间可以通过CGI,FCGI和uwsgi协议通信,当然uwsgi的性能是最好的。
uWSGI+Django
runserver方法时调试Django时经常使用的运行方式,它使用Django自带的WSGI Server运行,主要在测试和开发中使用,并且runserver开启的方式也是单进程。uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi、http等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的Web服务器。uWSGI具有超快的性能,低内存占用和多APP管理等优点,并且搭配着Nginx就是一个生产环境了。能够将用户访问的请求与应用APP隔开,实现真正的部署,相比起来,支持的并发量更高,方便管理多进程,发挥多核的优势,从而提升性能。
- uWSGI搭配Django可以:
- 支持的并发量更高
- 方便管理多进程,发挥多核的优势
- 提升性能,因为uwsgi协议比WSGI协议更有优势
- 再搭配上Nginx,就可以使你的APP反向代理。