参考https://blog.csdn.net/allenlinrui/article/details/19419721
一、介绍
通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI 独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。Unix shell script, Python, Ruby, PHP, perl, Tcl, C/C++, 和 Visual Basic 都可以用来编写 CGI 程序。
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减少Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。
由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署, 即 FastCGI 程序可以在web 服务器以外的主机上执行。
总结:CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。
二、配置(待补充)
三、简单的hello实例
安装完成后,可以在任意文件夹中编写一个简单的cpp程序,比如cgi.cpp
编译g++ cgi.cpp -o cgidemo -lfcgi
将CGI可执行程序移动到nginx目录下cp cgidemo /usr/local/nginx/fastcgi_temp/cgidemo(没有fastcgi_temp文件夹的话自己创建)
启动spawn-fcgi管理进程,并绑定server IP和端口(不要跟nginx的监听端口重合)
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 12345 -f /usr/local/nginx/fastcgi_temp/cgidemo
成功会显示
注:如果出现spawn-fcgi: child exited with: 0,是缺少while循环。
fastcgi代码要有应答循环过程,典型格式如下:
while (FCGI_Accept() >= 0) {//循环条件
# 应答循环体
}
知道一个客户端请求来的时候FCGI_Accept块才执行,并返回0。如果有一个系统故障,或是系统管理员终止进程,Accept将返回-1。
如果应用程序作为一个CGI程序被调用,那么第一次调用Accept时,返回0,第二次总是返回-1,产生CGI行为。
更改/usr/lcoal/nginx/conf/nginx.conf配置文件,加入
重新加载nginx配置文件
/usr/local/nginx/sbin/nginx -s reload
访问http://100.100.181.80/cgidemo.cgi