一、CGI是什么:

关于CGI是什么,这篇文章已经讲的非常清楚:

《万法归宗----CGI》

下面简单概括一下关于CGI的基本概念:

CGI = Common Gateway Interface,“通用网关接口”:

(1)“通用”,几乎所有的语言都支持CGI,都可以拿来编写CGI程序;

(2)“网关”,更形象的叫法是“协议翻译机”。通常与网关输入输出两端通信使用的是不同的协议,比如一方是HTTP,另一方可能是其他协议,比如企业内部自定义的协议等;
CGI程序通常部署在Web服务器上(Nginx、Apache),Web服务器调用CGI程序;

(3)“接口”,接口,API。

什么是接口协议:

协议是什么自不必说,通信双方或多方共同遵守的约定。

但是协议也分很多种:

二级制协议 - - - TCP/IP,协议内容是某某某字节、某某某比特位是干嘛的;

字符协议 - - - HTTP,描述第一行是干嘛的,第二行是干嘛的,没固定长度,没固定格式,按字符关键字去匹配;

这两种都是“网络协议”,描述报文内容详细语义的协议。

但是接口协议不同,接口协议一般指的是进行交换的接口间需要遵从的通信方式和要求,例如USB、Type-C、HDMI等。

CGI是如何工作的:

CGI程序本质上是OS操作系统上的一个普通的可执行的应用程序,

CGI可以理解为Web服务进程(Nginx进程、Apache进程)与一个运行在服务器上的CGI进程之间的协议,CGI会把HTTP请求消息中的请求头(Header)设置成进程的环境变量,把HTTP请求的包体设置成标准输入STDIN,进程的标准输出设置成HTTP响应(包含响应头和体),即返回一个HTML。

所以,CGI就是 Web服务器进程(Nginx、Apache)与 CGI进程 交互 的接口,输入HTTP请求(头和体),返回HTTP响应(头和体)。

CGI与Web应用服务器(Server)有何区别:

Nginx收到客户端的HTTP请求后有几种处理方式,对于静态资源的请求可直接返回资源给客户端,那么何时需要转发请求给应用服务器(如Tomcat),何时需要转发请求给CGI?

CGI与应用服务器的最大区别是:

Nginx与应用服务器之间通信使用的是HTTP协议,与CGI通信使用的标准输入输出流。

也就是说,CGI计算后产生的结果,是可以直接使用printf()在客户端上打印出来的(使用的标准输出流STDOUT),这样就有一些web场景必须要使用CGI,例如leetcode、实验楼等类型的在线编译工具,用户输入一段代码后编译结果就能在页面上打印显示出来。

(至于CGI如何计算,这个需要开发者去编写CGI的业务代码。)


二、CGI的缺点与FastCGI的引出:

CGI有一大硬伤:

每次HTTP请求CGI,Web服务器都要启动一个新的进程去运行这个CGI程序(颇具Unix特色的 fork-and-excute)。
当用户量巨大时,这样的操作会严重拖慢Web服务器的性能。

因此引出FastCGI,即一个常驻的进程池,由调度器负责将传递来的CGI请求传递给进程处理。

所以,FastCGI即使常驻型的CGI。


三、在Nginx中如何使用FastCGI:

1. 安装FastCGI库:

下载安装包后解压安装:

./configure
make
make install

2. 安装spawn-fcgi:

./configure
make
cp  /src/spawn_fcgi  /usr/local/nginx/sbin    # 拷贝spawn_fcgi可执行程序到/nginx/sbin目录下

3. 编写一个FastCGI的测试小程序:

#include <stdio.h>
#include <fcgi_stdio.h>int main() {while(FCGI_Accept() >= 0) {printf("Content-type: text/html\r\n");printf("\r\n");printf("<title>fast CGI Hello!</title>");printf("<h1>This is My CGI!</h1>");printf("Thank you, CGI.\n");}
}

编译生成可执行文件:

gcc cgi_test.c -o cgi_test -lfcgi                     //动态编译
gcc cgi_test.c -o cgi_test /usr/local/lib/libfcgi.a   //静态编译

(本机电脑中有点问题,动态编译一直报错找不到libfcgi.so,解决方法是在fcgi.conf的配置文件中指定动态链接库的位置:动态编译解决方法)

4. 使用 spawn-fcgi 工具启动 cgi_test 程序:

cgi_test从本质上说只是一个普通的Linux进程,单独的运行它(./cgi_test)不会起任何作用,因此需要借助spawn-fcgi 去指定 cgi_test 的监听IP地址和端口号。

cd /usr/local/sbin
./spawn-fcgi -a 127.0.0.1 -p 9002 -f /usr/local/cgi_test

spawn-fcgi指定cgi_test绑定IP地址127.0.0.1、监听端口号9002,启动程序的绝对路径所在的cgi_test。

启动成功后会打印提示:

spawn-fcgi: child spawned successfully: PID: 5432

注: spawn-fcgi命令的参数:

./spawn-fcgi -h          # 查看所有参数,其中主要的有:-f <path>               # filename of the fcgi-application
-a <address>          # bind to IPv4/IPv6 address
-p <port>             # bind to TCP port

5. 编写Nginx的配置文件:

worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;server {listen 9000;location ~\ .cgi {fastcgi_pass 127.0.0.1:9002;fastcgi_index index.cgi;fastcgi_param SCRIPT_FILENAME cgi$fastcgi_script_name;include ../conf/fastcgi_params;}}
}

关于配置文件中配置项的含义:

fastcgi_pass :# 类似于proxy_pass,也是服务器代理的功能。# proxy_pass指示将HTTP请求转到upstream中,fastcgi_pass则指示将请求转给后面标注的IP地址端口fastcgi_index  index.cgi :# 设置了fastcgi默认使用的脚本。就是当SCRIPT_FILENAME没有命中脚本的时候,使用的就是fastcgi_index设置的脚本。fastcgi_params:# 设置fastcgi请求中的参数,具体设置的东西可以在$_SERVER中获取到

随后使用编写的配置文件,启动Nginx:

./sbin/nginx -c my_conf/my_conf.conf

如何实现FastCGI负载均衡:

http {upstream fastcgi_end {server 127.0.0.1:9002 weight = 2;server 127.0.0.1:9005 weight = 1;}server {listen 9000;location ~\ .cgi {fastcgi_pass fastcgi_end;}}
}

6. 最后,在浏览器中访问cgi资源进行验证:

http://127.0.0.1:9000/123.cgi

显示页面:

因为Nginx配置文件中的策略是凡是 “.cgi” 后缀结尾的请求一律转到CGI程序处理,所有浏览器中输入的URI可以是任意名字的CGI文件,例如 “123.cgi”。


Tips:

1. Nginx配置文件中的正则表达式:

http {server {location ~\ .cgi {}}server {location ~\ .(mp3|mp4) {}}
}

~\ .cgi表示客户端的HTTP请求中的URI凡是以 “.cgi” 结尾的文件,都转到这个本location指示的服务器资源上去;
~\ .(mp3|mp4)表示以 “.mp3” 或者 “.mp4” 后缀结尾的请求。

2. 网关和路由器的区别:

简而言之,连接两个网络的设备,都是网关。

网关是一个大的概念,不具体特指一类产品,只要连接两个不同网络的设备都可以叫网关,路由器可以实现网关的功能。所谓网关,可以是路由器、三层交换机、防火墙等。


遗留问题:

FastCGI内部的工作原理是什么?
CGI都提供哪些更高级的功能?如何编写一个更复杂的CGI程序?

Nginx如何使用FastCGI相关推荐

  1. nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安装和配置

    nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安装和配置 0 之前知识回顾:  1) 目前各种服务器HTTP Server对PHP的支持一共有三种: a.通过HTTPServe ...

  2. wordpress支持MySQL5.5_CentOS 5.5安装Nginx、PHP(FastCGI)、MySQL --搭建LNMP环境安装Wordpress...

    一.总体介绍 系统环境  CentOS release 5.5 (Final)   ,kernel  2.6.18-194.el5 安装 Nginx . PHP(FastCGI)   . MySQL  ...

  3. 127.0.0.1 myz.php,在nginx上用FastCGI解析PHP

    nginx配置文件: Nginx 默认使用  include enable-php.conf;   通过enable-php.conf 来解析PHP,该文件内容如下 location ~ [^/]\. ...

  4. Nginx+PHP(FastCGI)搭建胜过Apache十倍的Web服务器

    前言:本文是我撰写的关于搭建"Nginx + PHP(FastCGI)"Web服务器的第6篇文章.本系列文章作为国内最早详细介绍 Nginx + PHP 安装.配置.使用的资料之一 ...

  5. [nginx源码]FastCGI模块详解

    目录 1.初识FastCGI协议 1.1消息头 1.2消息体举例 2. 基础知识 2.1 FastCGI配置 2.2FastCGI配置预处理 3.构造FastCGI请求 3.1FastCGI请求结构 ...

  6. php fastcgi进程启动,如何设置nginx的php fastcgi进程数

    九州编程 源码包可以在官方主页上下载.Ubuntu 7.10可以直接通过apt安装,也可以从这里下载最新的deb包:sudo apt-get install nginx如果要自己编译的话,需要确保自己 ...

  7. mac nginx php7 配置,mac os下配置nginx+php7.1+fastcgi

    推荐文章 MAC安装配置Tornado 下载文件 下载python,可以根据个人需要下载python2.x或者python3.x,下载tornado安装包. 开始安装 安装python和tornado ...

  8. nginx+web.py+fastcgi(spawn-fcgi)的session失效問題

    2019独角兽企业重金招聘Python工程师标准>>> web.py是用DiskStore保存session文件的,參考官網的例子,結果直接python code.py運行沒問題,但 ...

  9. nginx部署两个php虚拟主机,nginx服务器,fastcgi模式,添加虚拟主机(多站点)配置...

    phpStudy套件是一个非常火的php环境包,是一个非常不错的本地调试环境,支持xp.win7.win10,甚至很多朋友直接用在个人服务器上,虽然本人不推荐......但是这样确实很省事. 所以在欢 ...

最新文章

  1. Openssl:构建CA的过程并实现web服务基于https访问的网络架构
  2. Linux下进程通信的八种方法
  3. 拖动滑块拼图背景图没显示_计划B? 那是计划N…没什么。 拼图于2015年问世
  4. 耗时n年,38页《数据仓库知识体系.pdf》(数据岗位必备)
  5. 【转】Apache Solr 访问权限控制
  6. LocalStorage与SessionStorage
  7. 深入解析MVVM架构
  8. POJ 3267 The Cow Lexicon 动态规划
  9. pandas corr()函数
  10. python 03day上--网络基础及dos命令
  11. php 微信签到功能,微信小程序实现签到功能
  12. 2021-12-28学习的道路是寂寞的,学成后的成绩是惊艳的。喜欢热闹是生物的本性,耐得住寂寞方显人性尊贵
  13. 天气预报apipython_基于Python的免费天气预报接口查询
  14. VUE3(二十四)自定义alert弹窗组件
  15. 精读加密媒体扩展(Encrypted Media Extensions,EME)
  16. PHP日历函数相关预定义常量
  17. 算法工程师应该具备哪些工程能力
  18. mysql8修改密码报:Your password does not satisfy the current policy requirements
  19. 《火柴男人》:一切都是骗局但我要…
  20. 上来微软这条贼船有阵年头了

热门文章

  1. 多媒体文件格式(二):FLV 格式
  2. IGBT最基础的东西
  3. 爆肝七天!终于把分布式系统架构整理出来了
  4. 小白入门——Python标准库和第三方库简介
  5. Arcgis基于点位列表生成泰森多边形并导出面邻域结果,同时计算点位之间的间距、判断是否在方形缓冲区内
  6. 我们对区块链游戏的观点
  7. SQL实现新增表,表名更改,列名更改,约束更改等
  8. 平面设计师实习报告范文十篇
  9. Excel如何创建员工姓名的空白表,以统计工资等
  10. 考勤表生成器(区分节假日版本)