一 CGI

CGI定义

最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处理结果给客户端。那这个约定就是 common gateway interface,简称cgi。cgi是一种协议,而不是语言。

通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。CGI 独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。Unix shell script, Python, Ruby, PHP, perl, Tcl, C/C++, 和 Visual Basic 都可以用来编写 CGI 程序。

CGI流程

cgi的处理流程如下图所示:

web 服务器收到客户端(浏览器)的请求Http Request,启动CGI程序,并通过环境变量、标准输入传递数据
cgi进程启动解析器、加载配置(如业务相关配置)、连接其它服务器(如数据库服务器)、逻辑处理等
cgi程将处理结果通过标准输出、标准错误,传递给web 服务器
web 服务器收到cgi返回的结果,构建Http Response返回给客户端,并杀死cgi进程

WEB服务器与CGI程序交互

WEB服务器将根据CGI程序的类型决定数据向CGI程序的传送方式,一般来讲是通过标准输入/输出流和环境变量来与CGI程序间传递数据。 如下图所示:

CGI程序通过标准输入(STDIN)和标准输出(STDOUT)来进行输入输出。此外CGI程序还通过环境变量来得到输入,操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY-STRING向CGI程序传递Form中的数据。

环境变量

变量名 描述
CONTENT_TYPE 这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。
CONTENT_LENGTH 如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
HTTP_COOKIE 客户机内的 COOKIE 内容。
HTTP_USER_AGENT 提供包含了版本数或其他专有数据的客户浏览器信息。
PATH_INFO 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。
QUERY_STRING 如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。
REMOTE_ADDR 这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。
REMOTE_HOST 这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
REQUEST_METHOD 提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
SCRIPT_FILENAME CGI脚本的完整路径
SCRIPT_NAME CGI脚本的的名称
SERVER_NAME 这是你的 WEB 服务器的主机名、别名或IP地址。
SERVER_SOFTWARE 这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值为Apache/2.2.14(Unix)

标准输入

环境变量的大小是有一定的限制的,当需要传送的数据量大时,储存环境变量的空间可能会不足,造成数据接收不完全,甚至无法执行CGI程序。因此后来又发展出另外一种方法:POST,也就是利用I/O重新导向的技巧,让CGI程序可以由STDIN和STDOUT直接跟浏览器沟通。当我们指定用这种方法传递请求的数据时,web 服务器收到数据后会先放在一块输入缓冲区中,并且将数据的大小记录在CONTENT_LENGTH这个环境变数,然后调用CGI程式并将CGI程序的STDIN指向这块缓冲区,于是我们就可以很顺利的通过STDIN和环境变数CONTENT_LENGTH得到所有的资料,再没有资料大小的限制了。

总结:CGI使外部程序与Web服务器之间交互成为可能。CGI程式运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。

FastCgi

CGI工作原理:每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不适合了。于是就有了fastcgi。
FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。

快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减少Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。

当进来一个请求时,Web 服务器把环境变量和这个页面请求通过一个unix domain socket(都位于同一物理服务器)或者一个IP Socket(FastCGI部署在其它物理服务器)传递给FastCGI进程。

一般情况下,FastCgi的整个工作流程如下:

Web 服务器启动时载入初始化FastCGI执行环境。 例如IIS ISAPI、apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi
FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web 服务器的连接。启动FastCGI进程时,可以配置以ip和UNIX 域socket两种方式启动。
当客户端请求到达Web 服务器时, Web 服务器将请求采用socket方式转发到 FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器。Web 服务器将CGI环境变量和标准输入发送到FastCGI子进程。
FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web 服务器。当FastCGI子进程关闭连接时,请求便处理完成。
FastCGI子进程接着等待并处理来自Web 服务器的下一个连接。

由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署, 即 FastCGI 程序可以在web 服务器以外的主机上执行。

总结:CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。

关于nginx cgi/fastcgi和fastcgi程序的编写,可以参考下面的文章

http://www.cnblogs.com/liuzhang/p/3929198.html

http://www.ivpeng.com/pblog/detailed-fastcgi.html

CGI和FastCgi相关推荐

  1. 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?

    原文地址:http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/ 什么是CGI CGI全称是"公共网关 ...

  2. 什么是CGI、FastCGI、PHP-CGI、PHP-FPM

    什么是CGI CGI全称是"公共网关接口"(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其 ...

  3. CGI、FastCGI 知识总结

    一.CGI 1.基础介绍 公共网关接口CGI(Common GatewayInterface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位.CGI是外部应用程序(CGI程序)与Web服务器 ...

  4. PHP的SAPI【web server与应用程序沟通的标准泛称】:CGI、FastCGI 【web server与应用程序的具体标准】及其对应程序PHP-CGI PHP-FPM【具体的程序应用】

    1 Web Server与app传递数据的方法:Apache采用加载模块的方式 apache-> httpd[apache的进程]-> LoadModule->php5_module ...

  5. cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM

    一.抛个砖 1.Web Server传递数据的方法 正式说CGI之前,先来了解一下Web Server传递数据的另外一种方法:PHP Module加载方式.相信都会想起Apache吧,初学php时,在 ...

  6. cgi php是什么意思,cgi,fastcgi,php-cgi,php-fpm 是什么

    标签:接口   gate   gateway   fast   实现   执行环境   uil   bsp   管理程序 什么是cgi CGI(Common Gateway Interface)即公共 ...

  7. oracle使用cgi吗_php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

    CGI.FastCGI.php-fpm lnmp 在使用PHP开发应用时,我们用的最多的无非就是LNMP.LAMP等架构,这也是PHP开发的经典架构,使用起来简单好用,可正时因为简单好用, 使得很多人 ...

  8. (一)LAMP (CGI,fastcgi, PHP,基于php的LAMP架构,php连接数据库)

    文章目录 一. LAMP介绍 CGI fastcgi CGI和fastcgi 比较 LAMP工作原理 二. PHP(动态页面) 编译安装php PHP Zend Engine PHP的Opcode p ...

  9. 彻底明白php中cgi、fastcgi和php-cgi、php-fpm及php运行原理

    目录 1.CGI 2.FastCGI 3.PHP-CGI 4.PHP-FPM 5.PHP运行原理 1)mod_php模式 2)mod_fastcgi 模式 3)总结: 1.CGI 最早的Web服务器只 ...

  10. ngnix配置cgi和fastcgi

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 ngnix官网 spaw ...

最新文章

  1. MongoDB GridFS 存储文件
  2. moss 2007 单点登录的配置
  3. acm之vim的基本配置
  4. 面试官:说说 Spring 事务设计原理?面试必问!
  5. java注释及注释颜色设置
  6. 【大数据干货】基于Hadoop的大数据平台实施——整体架构设计
  7. 使用C语言判断一个数是否为素数
  8. python通过榛子云短信平台发送短信验证码
  9. 【转】固态硬盘恢复之30分钟大法操作技巧
  10. 梦中情人sbl新变种snow.exe,snowfall.exe的分析
  11. 【渝粤题库】广东开放大学 电子商务技术导论 形成性考核 -
  12. Arduino使用敲击模块和光遮断
  13. win10录屏快捷键?电脑技能操作看这里!
  14. 用 bat 批处理命令启动 Android Studio 自带模拟器
  15. 向鼠标右键添加菜单,例:向鼠标右键添加git bash here菜单
  16. 2020-06-08
  17. 微信开发工具制作会动的海绵宝宝
  18. Java并发编程知识大汇总
  19. 基于MATLAB交通标志自动识别装置
  20. Windows10下Linux子系统Ubuntu使用教程(1)——安装

热门文章

  1. 由于ORACLE_SID未设定造成的ora-12162 错误
  2. C语言中 malloc函数介绍
  3. Java 文件上传同时携带参数
  4. 电脑编辑安卓分区_20分钟轻松解决安卓手机分区问题 干货篇
  5. xampp mysql3306_xmapp_mysql端口冲突解决---Port 3306 in use by......
  6. wmic命令行工具介绍
  7. java wmic_wmic
  8. Paxos 实现日志复制同步(Basic Paxos)
  9. CAD 绘图如何有效的控制精度?
  10. 计算机成绩统计优秀率,高校学生考试成绩的数据分析模式与可视化研究