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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CGI(Common Gateway Interface)是一种通用的Web服务器和应用程序之间的接口标准,它定义了Web服务器如何向外部程序传递数据,以及如何从外部程序获取数据的规范。当Web服务器收到一个CGI请求时,它会启动一个CGI进程来处理该请求,CGI进程将执行一些特定的任务(如生成动态网页),并将结果返回给Web服务器,最终由Web服务器将结果发送给客户端。 FastCGI(Fast Common Gateway Interface)是CGI的改进版,它采用了一种新的进程管理方式,即通过复用已经存在的进程来处理多个请求,避免了每次请求都要启动一个新的CGI进程的开销,从而提高了性能和效率。 下面是它们的区别和联系: 1. 区别:FastCGICGI在进程管理方面的不同 FastCGI采用了一种新的进程管理方式,即用进程池的方式来处理多个请求,而CGI则是每个请求启动一个新的进程。这意味着FastCGI可以避免因频繁启动新进程而造成的性能损失。 2. 区别:FastCGI支持长连接,而CGI不支持 FastCGI支持长连接,即在一次请求中可以发送多个请求,而CGI只支持一次请求一个响应。 3. 联系:FastCGICGI都是Web服务器和应用程序之间的接口标准 无论是FastCGI还是CGI,它们都是Web服务器和应用程序之间的接口标准,用于定义Web服务器如何向外部程序传递数据,以及如何从外部程序获取数据的规范。 总之,FastCGI相对于CGI具有更好的性能和效率,并且支持长连接,但是它们都是Web服务器和应用程序之间的接口标准。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值