作者:auxten
链接:https://zhuanlan.zhihu.com/p/20054757
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CGI(Common Gateway Interface)

最初,CGI 是在 1993 年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd Web 服务器开发的。

这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立进程。CGI的第一个实现是 Perl 写的[1]。

  • 效率低下:每一个连接 fork 一个进程处理。
  • 功能十分有限:CGI只能收到一个请求,输出一个响应。很难在CGI体系去对Web请求的控制,例如:用户认证等。

正因为这些问题,在CGI诞生后的很长一段时间,各种Web Server都还是采用API这种强绑定的方式去支持Web开发,其中Apache的mod_php就属于这种方式。所以后面就有大神提出了FastCGI标准。

FastCGI(Fast Common Gateway Interface)

FastCGI使用进程/线程池来处理一连串的请求。这些进程/线程由FastCGI服务器管理,而不是Web服务器。 当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket长连接传递给FastCGI进程。所以FastCGI有如下的优点:

  • 性能:通过进程/线程池规避了CGI开辟新的进程的开销。
  • 兼容:非常容易改造现有CGI标准的程序。
  • 语言无关:FastCGI是一套标准,理论上讲只要能进行标准输出(stdout)的语言都可以作为FastCGI标准的Web后端。
    下面是一个简单FastCGI后端的伪代码
void main(void)
{
int count = 0;while(FCGI_Accept() >= 0) {printf(“Content-type: text/html\r\n”);printf(“\r\n”);printf(“Hello world!\r\n”);printf(“Request number %d.”, count++);}
exit(0);
}

  • Web Server隔离:FastCGI后端和Web Server运行在不同的进程中,后端的任何故障不会导致Web Server挂掉。
  • 专利:没有Apache mod_php之类的私有API的知识产权问题。
  • 扩展:FastCGI后端和Web Server通过Socket进行通信,两者可以分布式部署并方便进行横向扩展。

所以FastCGI一推出就几乎获得了所有主流Web Server的支持,Apache、Lighttpd、IIS、Cherokee……

题主说的php-fpm就是一种FastCGI的后端实现。

But,事情总是还有改进的余地的,FastCGI这套工作模式实际上没有什么太大缺陷,但是有些不安分的Python程序猿觉得,FastCGI标准下写异步的Web服务还是不太方便,如果能够收到请求后CGI端去处理,处理完毕后通过Callback回调来返回结果,那样岂不是很Coooool?!所以WSGI就被创造出来了:

WSGI(Web Server Gateway Interface)

Web服务器网关接口(Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

当Web Server收到一个请求后,可以通过Socket把环境变量和一个Callback回调函数传给后端Web应用,Web应用在完成页面组装后通过Callback把内容返回给Web Server。这样做的优点有很多:

  • 异步化,通过Callback将Web请求的工作拆解开,可以很方便的在一个线程空间里同时处理多个Web请求。
  • 方便进行各种负载均衡和请求转发,不会造成后端Web应用阻塞。
  1. Web开发有3P:Perl、Python、PHP。Perl是1987年发布的,Python是1989年,PHP是1995年。CGI标准提出的时候正是Perl如日中天的时候,所以CGI的提出当时也是主要为了解决Perl作为Web编程语言的需求。熟悉正则(regex)的程序员可能知道正则的事实标准叫做pcre(Perl兼容正则表达式,Perl Compatible Regular Expressions),这也从一个侧面体现了Perl作为一个古老的语言在当时对各种业界标准的影响。

From:漫谈CGI FastCGI WSGI

「真诚赞赏,手留余香」

转载于:https://www.cnblogs.com/DjangoBlog/p/6122803.html

漫谈CGI FastCGI WSGI相关推荐

  1. Nginx + CGI/FastCGI + C/Cpp

    http://www.cnblogs.com/skynet/p/4173450.html Nginx + CGI/FastCGI + C/Cpp 2014-12-19 11:05 by 吴秦, 197 ...

  2. Nginx + CGI/FastCGI + C/Cpp(编不过去,不搞了。。。)(Common Gateway Interface)

    Nginx + CGI/FastCGI + C/Cpp 文章目录 1.CGI 1.1.环境变量 1.2.标准输入 总结:CGI使外部程序与Web服务器之间交互成为可能.CGI程式运行在独立的进程中,并 ...

  3. CGI,FastCGI,spawn-fcgi,nginx组合使用

    目录 fastCGI 1. CGI 1.1 简介 1.2 CGI处理流程 1.3 环境变量 1.4 标准输入 1.5 CGI程序结构 1.6 测试 2. FastCGI 2.1 什么是FastCGI ...

  4. cgi、wsgi、uwsgi 与 uWSGI

    CGI(Common Gateway Inteface) 是外部应用程序与Web服务器之间的接口标准(通用网关接口) 用来规定一个程序该如何与web服务器程序之间通信从而可以让这个程序跑在web服务器 ...

  5. cgi,fastcgi,php-cgi,php-fpm之间的关系

    参考文章: https://segmentfault.com/q/1010000000256516 http://www.thinkphp.cn/topic/42338.html 这篇文章写的挺好:h ...

  6. php cgi fastcgi php-fpm区别

    CGI 的作用 CGI 是为了保证 web server 传递过来的数据是标准格式的,方便 CGI 程序的编写者. web server(比如说 nginx)只是内容的分发者. 如果请求 /index ...

  7. windos php7 fast cgi,FAST-CGI解析漏洞拿下网站并提权windows系统服务器

    作为一个懒散的人,我比较喜欢关注网上发布的漏洞.利用最新的漏洞可以比较简单的得到webshell,然后利用webshell提权拿下服务器,这个是我最喜欢的.有一个很有意思的娱乐网站,我经常登陆浏览,以 ...

  8. break是python合法标识符,Python笔记——break的注意事项

    ajax状态 ajax的几个状态 Uninitialized 初始化状态.XMLHttpRequest 对象已创建或已被 abort() 方法重置. Open open() 方法已调用,但是 send ...

  9. linux重新格式化分区表,linux 分区重新格式化

    看分区挂载 blkid cat /etc/fstab 先看已挂载的分区文件系统 df -Th 再看所属用户与组 ll -h 看哪些进程占用分区 ps -ef|grep /backup fuser -m ...

最新文章

  1. knllgobjinfo: MISSING Streams multi-version data dictionary!!! 的一次处理 (二)
  2. boost::is_sorted相关的测试程序
  3. 【计算几何】线段相交
  4. 计算机无法连接无线信号,win7系统连接无线信号时提示Windows无法连接到路由器名称的四种解决方法...
  5. git提交大文件的解决方法
  6. 计算机应用技术老师全国计算机应用技术考试,全国计算机应用证书 全国计算机应用技术证书考试作业.doc...
  7. 解决Qt-至少需要一个有效且已启用的储存库 问题
  8. 【Linux】mkdir命令
  9. MacBook M1 虚拟机安装Windows7 Xp
  10. mac上的android模拟器下载安装,Mac电脑上安装安卓模拟器,Mac如何安装Android模拟器...
  11. 搬运:php入门安装教程
  12. 【问链财经-区块链基础知识系列】 第二十课 区块链联盟链攻伐战
  13. pycharm电脑上怎么下载-Pycharm下载和安装图文教程[超详细]
  14. 玩转微信营销和推广的10种方法和技巧
  15. css引入本地字体文件,关于css中引入字体文件
  16. 连续性方程_连续性方程表示什么守恒
  17. STL-priority_queue用法(重点: 升序,小根堆)
  18. Android10及以上访问公有目录
  19. 电子元器件搜索引擎 白嫖AD原理图符号、PCB封装和3D模型(超详细)
  20. 博途数据类型wstring怎么用_博图V14关于自定义数据类型的疑问,大家都是怎么编程写中间标签的那。...

热门文章

  1. 【总结整理】写给非技术产品经理的技术能力要求----摘自《人人都是产品经理》...
  2. 为什么你需要考虑选择SaaS化持续交付产品?
  3. 《PHP、MySQL和Apache入门经典(第5版)》一2.7 基本安全规则
  4. VMware虚拟机关闭后托盘运行设置
  5. java.util.ResourceBundle用法
  6. win8 开发之旅(3) --五子棋游戏开发 前奏
  7. FireFox中国管理者的脑袋被驴踢了。
  8. curl -s http://192.168.232.191/openapi/v2 | jq 不显示JSON格式的文档说明
  9. android蓝牙串口arduino源码,android – Arduino:使用串口和软件串口与蓝牙模块
  10. 在容器内源码安装PostgreSQL13.2