Python的Web开发中,若是使用Django框架,那么较为成熟稳定的服务器架构通常是Nginx+uWSGI+Django。而为何必定要三个结合在一块儿呢?直接使用Django的runserver来启动服务器进程,或者uWSGI+Django可不能够呢?为何?
概念说明:html
Web协议出现顺序:
CGI -> FCGI -> WSGI -> uwsgipython
浏览器请求一个页面的流程:git
一个网站,通常有不少个不一样的请求,在这些请求中,基本1,2,4,5部都是固定的,变的只有第三步,因此把这四步抽象出来,让开发者只关注第三步,这样就能够极大提高开发效率。因此WSGI协议诞生了。
WSGI,全称 Web Server Gateway Interface。是Python专用的协议,其余语言没有。用于处理Web服务器和应用程序(APP)的交互信息。不少Web框架(如:django)都会自带WSGI服务器,可是性能很差,只做测试用途。github
实现一个最简单的服务器web
import pprint
def application(environ, start_response):
pprint.pprint(environ)
start_response('200 OK',[('Content-Type','text/html')])
return'<h1>Hello, web!</h1>'
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入咱们本身编写的application函数:
from app import application
# 建立一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('',8000, application)
print"Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()
python server.py
,就能够经过localhost:8000访问了wsgiref模块是python提供的,用于测试和学习的简单的WSGI服务器模块。
这个模块监听8000端口,把Http请求,根据WSGI协议,转换application函数中的environ参数,而后调用application函数。
wsgiref会把application函数提供的响应头设置转换为HTTP协议的响应头,把application的返回(return)做为响应体,根据HTTP协议,生成响应,返回给浏览器。django
这样,应用程序就不须要关注底层的HTTP协议细则了浏览器
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的区别是:安全
Ningx是一个反向代理服务器
什么是反向代理?服务器
反向代理的做用:网络
Nginx是一个高性能的HTTP和反向代理服务器。
Nginx+uWSGI+应用程序的架构:
其中Nginx和uWSGI之间能够经过CGI,FCGI和uwsgi协议通讯,固然uwsgi的性能是最好的。
最后附上一个介绍Nginx+uWSGI+Django的幻灯片
参考:
http://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://blog.csdn.net/qiaofeiw/article/details/9207359
http://www.cnblogs.com/wanghetao/p/3934350.html
http://book.51cto.com/art/201202/314840.htm
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832689740b04430a98f614b6da89da2157ea3efe2000
https://www.douban.com/note/13508388/
http://www.nowamagic.net/academy/detail/1330308
http://www.itopers.com:8080/?p=586