一、什么是CGI
- 通用网关接口(Common Gateway Interface、CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。 CGI 独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只 要这个语言可以在这个系统上运行。Unix shell script、Python、Ruby、PHP、perl、Tcl、C/C++ 和 Visual Basic 都可以用来编写 CGI 程序
- 最初,CGI 是在 1993 年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd Web 服务 器开发的。这个 Web 服务器使用了 UNIX shell 环境变量来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立的进程
- web 服务器与 CGI 通过环境变量、标准输入、标准输出、标准错误互相传递数据。在遇到用户连接请求:
- 先要创建 CGI 子进程,然后 CGI 子进程处理请求,处理完事退出这个子进程: fork-and-execute
- CGI 方式是客户端有多少个请求,就开辟多少个子进程,每个子进程都需要启动自己的 解释器、加载配置,连接其他服务器等初始化工作,这是 CGI 进程性能低下的主要原 因。当用户请求非常多的时候,会占用大量的内存、cpu 等资源,造成性能低下
- CGI 使外部程序与 Web 服务器之间交互成为可能。CGI 程序运行在独立的进程中,并对每 个 Web 请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请 求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限 制了资源重用
- 使用场景:例如牛客网等平台中的在线编程工具,网页客户端将数据当做输入传递给后端的cgi程序,cgi程序处理完成之后将结果作为输出返回给客户端
- cgi与server进程的区别:cgi使用输入输出与客户端进行交互,但是server使用的是http等协议与客户端进行交互
二、FastCGI
- 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI 致力于减少 Web 服务器 与 CGI 程式之间互动的开销,从而使服务器可以同时处理更多的 Web 请求。与为每个请求 创建一个新的进程不同,FastCGI 使用持续的进程来处理一连串的请求。这些进程由 FastCGI 进程管理器管理(例如下面我们要介绍的spawn-fcgi),而不是 web 服务器
- 由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的 应用效率。它的速度效率最少要比 CGI 技术提高 5 倍以上。它还支持分布式的部署,即 FastCGI 程序可以在 web 服务器以外的主机上执行
- CGI 是所谓的短生存期应用程序,FastCGI 是所谓的长生存期应用程序。FastCGI 像是一个常驻(long-live)型的 CGI,它可以一直执行着,不会每次都要花费时间去 fork 一次(这 是 CGI 最为人诟病的 fork-and-execute 模式)
- 总结起来就是:
- cgi是一个请求(一个客户端)对应一个进程,一个请求来时就创建一个cgi进程,请求结束后销毁该cgi进程
- FasiCGI就是在后端申请一个进程池,请求来了之后从进程池中取进程,而不用每次创建销毁
三、ngx_http_fastcgi_module模块
- Nginx有一个fast_cgi模块(ngx_http_fastcgi_module模块),其能与任何兼容FastCGI协议的服务器通信,该模块通过 fastcgi 协议将指定的客户端请求转发至 spawn-fcgi 处理
四、FastCGI通信协议
- FastCGI 是二进制连续传递的,定义了一个统一结构的消息头,用来读取每个消息的消息体, 方便消息包的切割。一般情况下, 最先发送的是 FCGI_BEGIN_REQUEST 类型的消息,然后是 FCGI_PARAMS 和 FCGI_STDIN 类型 的消息,当 FastCGI 响应处理完后,将发送 FCGI_STDOUT 和 FCGI_STDERR 类型的消息,最后以 FCGI_END_REQUEST 表示请求的结束
- FCGI_BEGIN_REQUEST 和 FCGI_END_REQUEST 分别表示请求的开始和结束,与整个协议相关
五、运行FastCGI程序的环境搭建
- 需要准备两样东西:
- cgi开发库:其提供相关cgi程序的接口,可以用来开发cgi程序
- spawn-fcgi:(FastCGI的进程管理器)cgi程序编写好之后,需要用spawn-fcgi来运行cgi程序
五、cgi开发库
- 使用 C/C++编写 FastCGI 应用程序,可以使用 FastCGI 软件开发套件或者其它开发框架,如 fcg
六、spawn-fcgi(FasiCGI进程管理器)
- Nginx不能像Apache那样直接执行外部可执行程序,但Nginx可以作为代理服务器,将请求转发给后端服务器,这也是Nginx的主要作用之一。其中 Nginx 就支持FastCGI代理,接收客户端的请求,然后将请求转发给后端FastCGI进程
- 由于FastCGI进程由FastCGI进程管理器管理,而不是Nginx。这样就需要一个 FastCGI 进程管理器,管理我们编写 FastCGI 程序
- spawn-fcgi是一个通用的 FastCGI 进程管理器,简单小巧,原先是属于 lighttpd 的一部分, 后来由于使用比较广泛,所以就迁移出来作为独立项目(此处我们使用C语言编写的FastCGI程序,因此用spawn-fcgi进行管理器,其他的进程管理器还有php-fpm(管理PHP的)等)
- spawn-fcgi 使用 pre-fork 模型,功能主要是打开监听端口,绑定地址,然后 fork-and-exec 创建我们编写的 FastCGI 应用程序进程,退出完成工作。FastCGI 应用程序初始化,然后进入死循环侦听 socket 的连接请求
七、echo回显应用程序
- 在fcgi源码包的example目录下有很多fcgi的演示案例,此处我们来使用echo这个程序案例
八、编程演示案例
- 让Nginx运行FastCGI程序的工作原理大致为:
- 第一步:先编写一个FastCGI程序(例如名为demo.c),然后将其编译为一个可执行程序(例如编译名为demo)
- 第二步:使用spwanfcgi程序运行你这个FastCGI程序demo
- 第三步:编写Nginx配置文件,在配置文件的location模块中使用FasiCGI指令声明你这个FastCGI程序
- 第四步:客户端通过URI访问Nginx配置文件中对应FastCGI程序的location的URI,与CGI程序进行交互
- 我是小董,V公众点击"笔记白嫖"解锁更多【Nginx】资料内容。
本文链接:https://my.lmcjl.com/post/7396.html
展开阅读全文
4 评论