CGI,FastCGI,WSGI概念解读

前言

涉及到一些名词解读,无奈能力有限,无法完全用自己的话来解释,只能拾人牙慧,做些整理的工作。如有不当,还请指出。

CGI

概念:CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI的工作方式大致可以描述为:

  1. 普通用户通过浏览器(或者是表单提交、或者是直接访问URL)发送请求给Web服务器

  2. Web服务器接收到请求后,启动CGI程序,通过环境变量、标准输入等传递数据,将请求转交给对应的CGI进程

  3. CGI进程启动解析器,或者访问数据库、或者完成相关计算、或者与其它第三方进行交互

  4. 在CGI程序处理完成后,通过标准输出将处理结果返回给Web服务器

  5. Web服务器收到结果后,构建Response返回给客户端,并杀死CGI进程

特点:CGI采用的是“fork-and-execute”的工作模式

问题:效率低下,每个请求都需要fork一个新的CGI进程去处理。当请求量增大时服务器很快将被压垮。

改进:

  1. 将脚本解释器直接作为模块集成在Web服务器中,例如:Apache的mod_perl模块,这样就能够避免重复载入和初始化解释器。不过这只是针对那些解释型语言而言的,使用诸如C一类的编译型语言则可以避免这种额外负荷。由于C及其他编译语言的程序与解释语言程序相比,前者的运行速度更快、对操作系统的负荷更小,使用编译语言程序是可能达到更高执行效率的。然而因为开发效率等因素,在目前解释型语言还是最合适的。
  2. 使用FastCGI技术

FastCGI

概念:FastCGI(快速通用网关接口),是CGI的增强版本。
特点:减少Web服务器与CGI程序之间交互的开销,使得服务器可以同时处理更多的请求。与CGI“fork-and-execute”的工作模式不同,FastCGI像是一个常驻型的CGI,它使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是Web服务器。当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个unix domain socket(比如FastCGI进程与Web服务器都位于本地)或者一个TCP连接(FastCGI进程部署在远端)传递给FastCGI进程。

应用:

  • PHP-CGI,PHP自带的FastCGI管理器
  • PHP-FPM,PHP FastCGI管理器,最初它只是PHP源码的一个补丁,而从PHP 5.3.3开始,已经被集成到了PHP源码中。与原生的PHP-CGI相比,它提供了更加友好的管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
  • Spawn-FCGI,一个通用的FastCGI管理器,起初它是lighttpd的一部分。目前,Spawn-FCGI已经独立成为一个项目,性能较以往更加稳定。

FastCGI的工作方式大致可以描述为:

  1. Web服务器启动时,初始化FastCGI执行环境,例如apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接
  3. 当客户端请求到达Web服务器时,Web服务器将请求通过socket方式转发到FastCGI主进程,主进程选择并连接到一个CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程
  4. FastCGI子进程完成处理后,将标准输出和错误信息通过同一socket返回给Web服务器,并关闭连接
  5. FastCGI子进程接着等待下一个新的连接

缺点:以PHP-CGI为例

  1. 变更php.ini配置后,需重启PHP-CGI才能生效,不能平滑重启
  2. 直接杀死PHP-CGI进程,PHP就不能运行了(PHP-FPM和Spawn-FCGI就没有这个问题了,守护进程会平滑地重新生成新的子进程)

改进:FastCGI标准下写异步的Web服务还是不太方便,希望能够收到请求后CGI端去处理,处理完毕后通过Callback回调来返回结果,有了WSGI。

WSGI

概念:WSGI(Web Server Gateway Interface)是专门为Python定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

WSGI的工作方式大致可以描述为:
当Web服务器接收到一个请求后,可以通过Socket把环境变量和一个callback回调函数传递给后端Web应用程序,Web应用程序处理完成后,调用callback函数,把结果返回给WebServer。

代码描述:

	def application(env, start_response):
	    start_response('200 OK', [('Content-Type', 'text/html')])
	    return [b"Hello World"]

方法 application由 web服务器调用,参数env,start_response 由 web服务器实现并传入。其中,env是一个字典,包含了类似 HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO 等环境变量。start_response则是一个方法,该方法接受两个参数,分别是status,response_headers。application方法的主要作用是,设置 http 响应的状态码和 Content-Type 等头部信息,并返回响应的具体结果。

上述代码就是一个完整的 WSGI 应用,当一个支持 WSGI 的 web服务器接收到客户端的请求后,便会调用这个 application 方法。WSGI 层并不需要关心env,start_response 这两个变量是如何实现的,就像在 application 里面所做的,直接使用这两个变量即可。

应用:
比如 Flask,webpy,Django、CherryPy ,python都带着 WSGI server 。当然性能都不好,自带的web server 更多的是测试用途, 线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。
Gunicorn是一个Python WSGI UNIX的HTTP服务器。
特点是与各个web结合紧密,部署特别方便。缺点也很多,不支持HTTP1.1,并发访问性能不高。

优点:

  1. 异步化,通过callback将Web请求的工作拆解开,可以很方便地在一个线程空间里同时处理多个Web请求
  2. 方便进行各种负载均衡和请求转发,不会造成后端Web应用阻塞

uwsgi 和uWSGI

概念:uwsgi 同 wsgi 一样也是一种协议,uWSGI服务器正是使用了 uwsgi 协议;uWSGI实现了 uwsgi 和 WSGI 两种协议的web服务器。
注意: uWSGI 本质上也是一种 web服务器,处于上面描述的三层结构中的 web服务器层。

总结:WSGI是python的接口规范,这个规范是针对WEB服务器和python应用(框架等)的交互的。FASTCGI则是两者底层的通信协议的规范。

参考链接

网关协议学习:CGI、FastCGI、WSGI:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
聊聊CGI、FastCGI、WSGI:https://www.jianshu.com/p/1f8aec6f2bd1
WSGI、flup、fastcgi、web.py的关系:https://www.douban.com/note/13508388/
如何理解Nginx, WSGI, Flask之间的关系:https://blog.csdn.net/shenxiaoming77/article/details/80093240
简单的WSGI例子:https://blog.csdn.net/violet_echo_0908/article/details/52292350
网关协议学习:CGI、FastCGI、WSGI:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html

猜你喜欢

转载自blog.csdn.net/Kachuan/article/details/88714660