zoukankan      html  css  js  c++  java
  • [转] Nginx + CGI/FastCGI + C/Cpp

    接着上篇《Nginx安装与使用》,本篇介绍CGI/FASTCGI的原理、及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx。内容大纲如下:

    1.     CGI

    1.1.     环境变量

    1.2.     标准输入

    2.     FastCGI

    参考链接

    1.CGI

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

    最初,CGI 是在 1993 年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd Web 服务器开发的。这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立的进程。cgi的处理流程如下图所示:

     

    l   step1. web 服务器收到客户端(浏览器)的请求Http Request,启动CGI程序,并通过环境变量标准输入传递数据

    l   step2. cgi进程启动解析器、加载配置(如业务相关配置)、连接其它服务器(如数据库服务器)、逻辑处理等

    l   step3. cgi程将处理结果通过标准输出标准错误,传递给web 服务器

    l   step4. web 服务器收到cgi返回的结果,构建Http Response返回给客户端,并杀死cgi进程

    web服务器与cgi通过环境变量、标准输入、标准输出、标准错误互相传递数据。

    1.1.环境变量

    GET请求,它将数据打包放置在环境变量QUERY_STRING中,CGI从环境变量QUERY_STRING中获取数据。常见的环境变量如下表所示:

    环境变数

    内容

    AUTH_TYPE

    存取认证类型。

    CONTENT_LENGTH

    由标准输入传递给CGI程序的数据长度,以bytes或字元数来计算。

    CONTENT_TYPE

    请求的MIME类型。

    GATEWAY_INTERFACE

    服务器的CGI版本编号。

    HTTP_ACCEPT

    浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.

    HTTP_USER_AGENT

    递交表单的浏览器的名称、版本 和其他平台性的附加信息。

    HTTP_REFERER

    递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它

    PATH_INFO

    传递给cgi程式的路径信息。

    QUERY_STRING

    传递给CGI程式的请求参数,也就是用"?"隔开,添加在URL后面的字串。

    REMOTE_ADDR

    client端的host名称。

    REMOTE_HOST

    client端的IP位址。

    REMOTE_USER

    client端送出来的使用者名称。

    REMOTE_METHOD

    client端发出请求的方法(如get、post)。

    SCRIPT_NAME

    CGI程式所在的虚拟路径,如/cgi-bin/echo。

    SERVER_NAME

    server的host名称或IP地址。

    SERVER_PORT

    收到request的server端口。

    SERVER_PROTOCOL

    所使用的通讯协定和版本编号。

    SERVER_SOFTWARE

    server程序的名称和版本。

    1.2.标准输入

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

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

    2.FastCGI

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

     

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

     

    l  step1. Web 服务器启动时载入初始化FastCGI执行环境 。 例如IIS ISAPI、apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi

    l  step2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web 服务器的连接。启动FastCGI进程时,可以配置以ip和UNIX 域socket两种方式启动。 

    l  step3. 当客户端请求到达Web 服务器时, Web 服务器将请求采用socket方式转发到 FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器。Web 服务器将CGI环境变量和标准输入发送到FastCGI子进程。

    l  step4. FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web 服务器。当FastCGI子进程关闭连接时,请求便处理完成。

    l  step5. FastCGI子进程接着等待并处理来自Web 服务器的下一个连接。

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

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

    参考链接

    l  CGI, http://www.dwz.cn/yFFgQ

    l  fastcgi, http://www.dwz.cn/yFMap

    l  spawn-fcgi, http://redmine.lighttpd.net/projects/spawn-fcgi/wiki

    l  fcgi, http://www.fastcgi.com/drupal/node/6?q=node/21

    l  fcgiwrap, https://github.com/gnosek/fcgiwrap.git

  • 相关阅读:
    为什么需要防火墙?
    比较流行的前端框架
    java基础面试题
    单列模式
    简单而且好用的随机验证码
    java中的九大隐藏变量.
    搭建Disuz论坛社区
    BZOJ 1006 [HNOI2008]神奇的国度
    COJ 0252 HDNOIP201304阻断传染
    BZOJ 1005 [HNOI2008]明明的烦恼
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4885817.html
Copyright © 2011-2022 走看看