CGI

通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准。wiki Common_Gateway_Interface
这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的 独立进程 。CGI的第一个实现是 Perl 写的 1 。

  • 效率低下:每一个连接 fork 一个进程处理。
  • 功能十分有限:CGI只能收到一个请求,输出一个响应。

FastCGI

快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,FastCGI使用进程/线程池来处理一连串的请求。这些进程/线程由FastCGI服务器管理,而不是Web服务器。 当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket长连接传递给FastCGI进程。wiki FastCGI

  • 性能:通过进程/线程池规避了CGI开辟新的进程的开销。
  • 语言无关:FastCGI是一套标准,理论上讲只要能进行标准输出(stdout)的语言都可以作为FastCGI标准的Web后端。

安装FCGI

获取FCGI安装包,http://www.fastcgi.com/drupal/node/5

sudo ./configure
sudo make && make install 
fcgio.cpp: In destructor 'virtual fcgi_streambuf::~fcgi_streambuf()':
fcgio.cpp:50:14: error: 'EOF' was not declared in this scopeoverflow(EOF);^
fcgio.cpp: In member function 'virtual int fcgi_streambuf::overflow(int)':
fcgio.cpp:70:72: error: 'EOF' was not declared in this scopeif (FCGX_PutStr(pbase(), plen, this->fcgx) != plen) return EOF;^
fcgio.cpp:75:14: error: 'EOF' was not declared in this scopeif (c != EOF) ^
fcgio.cpp: In member function 'virtual int fcgi_streambuf::sync()':
fcgio.cpp:86:18: error: 'EOF' was not declared in this scopeif (overflow(EOF)) return EOF;^
fcgio.cpp:87:41: error: 'EOF' was not declared in this scopeif (FCGX_FFlush(this->fcgx)) return EOF;^
fcgio.cpp: In member function 'virtual int fcgi_streambuf::underflow()':
fcgio.cpp:113:35: error: 'EOF' was not declared in this scopeif (glen <= 0) return EOF;^
Makefile:311: recipe for target 'fcgio.lo' failed

解决办法:在/include/fcgio.h文件中加上 #include ,然后再编译安装就通过了。

安装 spawn-fcgi

spawn-fcgi是一个通用的FastCGI进程管理器,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了。spawn-fcgi使用pre-fork 模型,功能主要是打开监听端口,绑定地址,然后fork-and-exec创建我们编写的fastcgi应用程序进程,退出完成工作。fastcgi应用程序初始化,然后进入死循环侦听socket的连接请求。

sudo apt-get install spawn-fcgi
#可以man spawn-fcgi查看帮助
#include <stdlib.h>
#include "fcgi_stdio.h"int main(void)
{int count = 0;while (FCGI_Accept() >= 0)printf("Content-type: text/html\r\n""\r\n""<title>FastCGI Hello!</title>""<h1>FastCGI Hello!</h1>""<div>Request number %d running on host : %s </div>\n""<div>QUERY_STRING : %s\n</div>""<div>REMOTE_ADDR : %s\n</div>""<div>REMOTE_PORT : %s\n</div>""<div>REQUEST_METHOD : %s\n</div>""<div>CONTENT_TYPE : %s\n</div>""<div>CONTENT_LENGTH : %s\n</div>""<div>SERVER_PROTOCOL : %s\n</div>""<div>REQUEST_URI : %s\n</div>""<div>SERVER_SOFTWARE : %s\n</div>",++count, getenv("SERVER_NAME"),getenv("QUERY_STRING"),getenv("REMOTE_ADDR"), getenv("REMOTE_PORT"), getenv("REQUEST_METHOD"),getenv("CONTENT_TYPE"),getenv("CONTENT_LENGTH"),getenv("REQUEST_URI"),getenv("SERVER_PROTOCOL"), getenv("SERVER_SOFTWARE"));return 0;
}
#编译,并将demo部署到/var/www/cgi-bin/目录sudo g++ main.cpp -o demo -l fcgi
#添加动态库路径
/etc/ld.so.conf中添加fcgi的安装路径,如/usr/local/lib,并执行ldconfig更新一下
sudo spawn-fcgi -f /var/www/cgi-bin/demo -a 127.0.0.1 -p 9000#出现的错误,spawn-fcgi: child exited with: 127
#只在控制台运行了下export LD_LIBRARY_PATH=/usr/local/lib
#spawn进程时找不到动态库,将export写入/etc/profile文件,或/etc/ld.so.conf添加动态库路径

nginx配置

location ~ ^/cgi-bin/.*\.cgi$ {root /var/www;fastcgi_pass  127.0.0.1:9000;fastcgi_index index.cgi;include fastcgi.conf;
}

请求http://127.0.0.1/cgi-bin/index.cgi?key1=value1

nginx + cgi

nginx 不能直接执行外部可执行程序,并且cgi是接收到请求时才会启动cgi进程,不像fastcgi会在一开就启动好,这样nginx天生是不支持 cgi 的。nginx 虽然不支持cgi,但它支持 fastCGI。所以,我们可以考虑使用fastcgi包装来支持 cgi。原理大致如下图所示:pre-fork几个通用的代理fastcgi程序——fastcgi-wrapper,fastcgi-wrapper启动执行cgi然后将cgi的执行结果返回给nginx(fork-and-exec)。

安装fastcgi-wrapper

git clone https://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install
#启动fastcgi-wrapper
sudo spawn-fcgi -f /usr/local/sbin/fcgiwrap -p 9002
#include <stdio.h>
#include <stdlib.h>int main(void)
{int count = 0;printf("Content-type: text/html\r\n""\r\n""<title>CGI Hello!</title>""<h1>CGI Hello!</h1>""Request number %d running on host <i>%s</i>\n",++count, getenv("SERVER_NAME"));return 0;
}
sudo g++ main2.cpp -o demo2.cgi   -l fcgi


如果出现403 Forbidden检查文件名是否对应

参照:

Nginx + CGI/FastCGI + C/Cpp
fastcgi
https://github.com/gnosek/fcgiwrap.git

nginx配置cgi相关推荐

  1. ngnix配置cgi和fastcgi

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

  2. CentOS Linux 7 配置 nginx 支持 CGI

    Nginx 本身不能执行外部程序,Nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户:所以如果我们需要通过 cgi 程 ...

  3. 小程序PHP CGI,微信小程序php服务端nginx配置

    微信小程序php服务端nginx配置 微信小程序server端如果选择自己部署的话,可以选择java或者php的,为了省事我选择了php的,腾讯是用CodeIgniter框架做的demo,由于CI框架 ...

  4. linux cgi c环境配置,Linux下配置nginx支持.cgi | 系统运维

    说明: 操作系统:CentOS 6.x web环境:php+nginx+mysql nginx安装目录:/usr/local/nginx nginx配置文件:/usr/local/nginx/conf ...

  5. Nginx支持CGI

    一.安装perl库 perl-FCGI.perl-FCGI-ProcManager.perl-IO-ALL(如下文件均可以去http://search.cpan.org下载) #wget http:/ ...

  6. php+php-fom+nginx配置参数调优详解

    文章目录 一.前言 1.mysql配置参数: 2.注意 二.php参数配置及讲解 1.phpini的基本设置 2.php参数设置 三.php-fpm设置 1.设置子进程数,增加并发量 2.防止频繁出现 ...

  7. Nginx配置参数说明

    本文详细介绍了Nginx配置的一些参数说明,为以后的配置提供一定的帮助.有两种方式来通过这些信号去控制 Nginx,第一是通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进 ...

  8. nginx配置php 9000,Nginx支持php配置

    Nginx本身是不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用.FastCGI接口在Linux 下是socket,(这个socket可以是文件sock ...

  9. centos6.8 环境一键安装包 nginx配置thinkphp5

    ---恢复内容开始--- lnmp1.4 一键安装包 nginx配置thinkphp5 环境:Nginx1.12.1  PHP5.6  Coentos6.8 修改网站配置文件  server{list ...

最新文章

  1. 没有统计学基础可以学python-想入门数据分析,现在转行还来得及吗?
  2. 数据结构-----Trie树
  3. wangeditor修改图片上传和视频上传
  4. centos7 安装redis_Redis6安装(上) - 单机单实例
  5. 流式计算的代表:Storm、Flink、Spark Streaming
  6. 12 月 Web 服务器调查:“王者” nginx 增长最快!
  7. Javascript基础系列之(五)条件语句(if条件语句)
  8. 如何在Shell脚本中使用if-else?
  9. 马斯洛需求的五个层次_运用马斯洛需求层次理论分析《吞噬星空》爽点之第九章...
  10. java左移负数位_java的左移运算符和右移运算符
  11. PostgreSQL学习手册(PL/pgSQL过程语言)
  12. 用GridView做国际象棋
  13. 自定义万能回弹插值器 BounceInterpolator
  14. html 图层嵌套特点,ps图层有哪几种类型?
  15. 使用注册表reg文件修复git bash git gui 右键快捷方式
  16. 巴比特 | 元宇宙每日荐读:三位手握“价值千万”藏品的玩家,揭秘数字藏品市场“三大套路”...
  17. AcWing蓝桥杯AB组辅导课10、疑难杂题
  18. iOS App各种路径
  19. 学习学习学习学习学习学习学习学习学习学习学习
  20. mac键盘上符号的快捷键_Mac键盘符号实际上是什么意思?

热门文章

  1. js 直接打开选择文件窗口_RPGMakerMV探秘01-文件结构
  2. LeetCode第 621 题:任务调度器 (C++)
  3. 打印华氏温度与摄氏温度对照表
  4. 迅捷PDF文件转换Excel
  5. Git与SVN区别,各自优缺点
  6. origin作图 基础中的基础 一图一opj
  7. Docker技术入门与实战 第2版
  8. 分享两个百度网盘提速方法
  9. 稀疏贝叶斯学习推导过程
  10. 计算机病毒防护软件有哪些,电脑防护软件排名