相信你们在学习web开发的过程当中必定会遇到 cgi、 wsgi 之类的名词,而后看着他们十分类似的解释估计还没开始写代码就晕了,这都什么鬼?css
反正我最开始学习那会儿就不知道这些都是个啥,我也推荐学习过程不要纠结于某个词语的解释。当你拥有必定开发经验,对 web 开发有一个更系统的认识后回过头来看以前的疑惑也许就迎刃而解了,今天我就谈谈当初对这些看着十分类似的名词的浅见:html
CGI(Common Gateway Inteface): 字面意思就是通用网关接口,我以为之因此看字面意思跟没看同样是由于这个称呼自己很学术,因此对于通俗的理解就存在必定困难,这里我以为直接把 Gateway 看成 server 理解就好。前端
它是外部应用程序与Web服务器之间的接口标准python
意思就是它用来规定一个程序该如何与web服务器程序之间通讯从而可让这个程序跑在web服务器上。固然,CGI 只是一个很基本的协议,在现代常见的服务器结构中基本已经没有了它的身影,更多的则是它的扩展和更新。nginx
在讲更进一步以前首先咱们要了解目前比较常见的服务端结构:web
假设咱们使用 python 的 Django 框架写了一个网站,如今要将它挂在网上运行,咱们通常须要:后端
- nginx 作为代理服务器:负责静态资源发送(js、css、图片等)、动态请求转发以及结果的回复;
- uWSGI 作为后端服务器:负责接收 nginx 请求转发并处理后发给 Django 应用以及接收 Django 应用返回信息转发给 nginx;
- Django 应用收到请求后处理数据并渲染相应的返回页面给 uWSGI 服务器。
####接下来的协议及接口就是应用在以上三者之间:服务器
FastCGI: CGI的一个扩展, 提高了性能,废除了 CGI fork-and-execute
(来一个请求 fork 一个新进程处理,处理完再把进程 kill 掉)的工做方式,转而使用一种长生存期的方法,减小了进程消耗,提高了性能。markdown
这里 FastCGI 就应用于前端 server(nginx)与后端 server(uWSGI)的通讯中,制定规范等等,让先后端服务器能够顺利理解双方都在说什么(固然 uWSGI 自己并不用 FastCGI, 它有另外的协议)架构
WSGI(Python Web Server GateWay Interface):它是用在 python web 框架编写的应用程序与后端服务器之间的规范(本例就是 Django 和 uWSGI 之间),让你写的应用程序能够与后端服务器顺利通讯。在 WSGI 出现以前你不得不专门为某个后端服务器而写特定的 API,而且没法更换后端服务器,而 WSGI 就是一种统一规范, 全部使用 WSGI 的服务器均可以运行使用 WSGI 规范的 web 框架,反之亦然。
uWSGI: 是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。用于接收前端服务器转发的动态请求并处理后发给 web 应用程序。
uwsgi: 是uWSGI服务器实现的独有的协议, 网上没有明确的说明这个协议是用在哪里的,我我的认为它是用于前端服务器与 uwsgi 的通讯规范,至关于 FastCGI的做用。固然这只是我的看法,我在知乎进行了相关提问,欢迎共同讨论。
简单来说,这些名词的关系就是下图:
对于 CGI ,我认为在 CGI 制定的时候也许没有考虑到现代的架构,因此他只是一个通用的规范,然后来的 WSGI 也好 Fastcgi 也好等等这些都是在 CGI 的基础上扩展并应用于现代Web Server 不一样地方的通讯规范, 因此我在图中将 CGI 标注在整个流程之上。
作为一个 Python Web 开发者,相信以上流程咱们最关注的莫过于 WSGI 这里所作的事,了解熟悉这里的规范不只可让咱们更快速的开发 Web 应用同时咱们也能够本身实现一个后端 Server 。