- 操作系统
- 跨平台
- 开发语言
- C/C++
- 开源协议
- 未知
-
2022-03-06 15:41:57
FastCGI
CGI
什么是CGI
CGI(common gateway interface)通用网关接口描述了客户端和服务器程序之间传输数据的⼀种标准,可以让⼀个客户端,从⽹⻚浏览器向执⾏在⽹络服务器上的程序请求数据。
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的独⽴的进程。CGI处理流程
web浏览器 web浏览器
| |
|1.http request |4.http response
| |
web服务器 web服务器
| |
|2.stdin |3.stdout,stderr
| |
启动CGI解析器 -> 加载配置 -> 连接其他服务器 -> 逻辑处理 -> 退出- web服务器收到客户端(浏览器)的请求Http Request,启动CGI程序,并通过环境变量、标准输⼊传递 数据
- CGI进程启动解析器、加载配置(如业务相关配置)、连接其它服务器(如数据库服务器)、逻辑处理等
- CGI进程将处理结果通过标准输出、标准错误,传递给web服务器
- web服务器收到CGI返回的结果,构建Http Response返回给客户端,并杀死CGI进程
特点
- web服务器和CGI通过环境变量、标准输入、标准输出、标准错误互相传递数据。
- web服务器接受到多少个请求就创建多少个CGI子进程,处理完请求后退出子进程,fork-and-execute。
- 每个⼦进程都需要启动⾃⼰的解释器、加 载配置,连接其他服务器等初始化⼯作,这是CGI进程性能低下的主要原因。当⽤户请求⾮常多的 时候,会占⽤⼤量的内存、cpu等资源,造成性能低下。
- CGI使外部程序与Web服务器之间交互成为可能。CGI程序运⾏在独⽴的进程中,并对每个Web请求建 ⽴⼀个进程,这种⽅法⾮常容易实现,但效率很差,难以扩展。⾯对⼤量请求,进程的⼤量建⽴和消亡 使操作系统性能⼤⼤下降。此外,由于地址空间⽆法共享,也限制了资源重⽤。
环境变量
GET请求它将数据打包放置在环境变量QUERY_STRING中,可以通过getenv(“QUERY_STRING”)函数获取数据。
环境变数 含义 AUTH_TYPE 存取认证类型 CONTENT_LENGTH 由标准输⼊传递给CGI程序的数据⻓度,以bytes或字元数来计算 CONTENT_TYPE 请求的MIME类型 GATEWAY_INTERFAC E 服务器的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程序的名称和版本 标准输入
环境变量的⼤⼩是有⼀定的限制的,当需要传送的数据量⼤时,储存环境变量的空间可能会不⾜,造成数据接收不完全,甚⾄⽆法执⾏CGI程序。
因此后来⼜发展出另外⼀种⽅法:POST,也就是利⽤I/O重新导向的技巧,让CGI程序可以由stdin和stdout直接跟浏览器沟通。
当我们指定⽤这种⽅法传递请求的数据时,web服务器收到数据后会先放在⼀块输⼊缓冲区中,并且将数据的⼤⼩记录在CONTENT_LENGTH这个环境变量,然后调⽤CGI程序并将CGI程序的stdin指向这块缓冲区,于是我们就可以很顺利的通过stdin和环境变数CONTENT_LENGTH得到所有的信息,再没有信息⼤⼩的限制了。FastCGI说明
什么是FastCGI
FastCGI(Fast Common Gateway Interface)快速通用网关接口,是通用网关接口CGI的改进。描述了客户端和服务器程序之间传输数据的⼀种标准。
FastCGI致⼒于减少Web服务器与CGI程式之间互动的开销,从⽽使服务器可以同时处理更多的Web请求。与为每个请求创建⼀个新的进程不同,FastCGI使⽤持续的进程来处理⼀连串的请求。这些进程由FastCGI进程管理器管理,⽽不是web服务器。
nginx服务⽀持FastCGI模式,能够快速⾼效地处理动态请求。⽽nginx对应的FastCGI模块为:ngx_http_fastcgi_module。
ngx_http_fastcgi_module模块允许将请求传递给FastCGI服务器。处理流程
FastCIG进程管理器:启动CGI解析器 -> 加载配置 -> 连接其他服务器 -> 进行循环
web浏览器
|1
web服务器
|2
FastCGI执行环境
|3
进入循环 -> 逻辑处理 -> 退出 -> 循环等待
|4
web服务器
|5
web浏览器- Web服务器启动时载⼊初始化FastCGI执⾏环境。例如IIS、ISAPI、apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi。
- FastCGI进程管理器⾃身初始化,启动多个CGI解释器进程并等待来⾃Web服务器的连接。启动FastCGI进程时,可以配置以ip和UNIX域socket两种⽅式启动。
- 当客户端请求到达Web服务器时,Web服务器将请求采⽤socket⽅式转发FastCGI主进程,FastCGI主进程选择并连接到⼀个CGI解释器。Web服务器将CGI环境变量和标准输⼊发送到FastCGI⼦进程。
- FastCGI⼦进程完成处理后将标准输出和错误信息从同⼀socket连接返回Web服务器。当FastCGI⼦进程关闭连接时,请求便处理完成。
- FastCGI⼦进程接着等待并处理来⾃Web服务器的下⼀个连接。
FastCGI特点
- CGI是所谓的短⽣存期应⽤程序,FastCGI是所谓的⻓⽣存期应⽤程序。FastCGI像是⼀个常驻(long-live)型的CGI,它可以⼀直执⾏着,不会每次都要花费时间去fork⼀次(这是CGI最为⼈诟病的fork-and-execute模式)。
- FastCGI⼦进程完成处理后将标准输出和错误信息从同⼀socket连接返回Web服务器。
进程管理器spawn-fcgi
什么是spawn-fcgi
Nginx不能像Apache那样直接执⾏外部可执⾏程序,但Nginx可以作为代理服务器,将请求转发给后端服务器,这也是Nginx的主要作⽤之⼀。其中Nginx就⽀持FastCGI代理,接收客户端的请求,然后将请求转发给后端FastCGI进程。
由于FastCGI进程由FastCGI进程管理器管理,⽽不是Nginx。这样就需要⼀个FastCGI进程管理器,管理我们编写FastCGI程序。
spawn-fcgi是⼀个通⽤的FastCGI进程管理器,简单⼩巧,原先是属于lighttpd的⼀部分,后来由于使⽤⽐较⼴泛,所以就迁移出来作为独⽴项⽬。
spawn-fcgi使⽤pre-fork模型,功能主要是打开监听端⼝,绑定地址,然后fork-and-exec创建我们编写的FastCGI应⽤程序进程,退出完成⼯作。FastCGI应⽤程序初始化,然后进⼊死循环侦听socket的连接请求。
spawn-fcgi源码包下载地址:http://redmine.lighttpd.net/projects/spawn-fcgi/wiki
fcgi开发套件
使⽤C/C++编写FastCGI应⽤程序,可以使⽤FastCGI软件开发套件或者其它开发框架,如fcgi。
fcgi下载地址:wget https://fossies.org/linux/www/old/fcgi-2.4.0.tar.gzFastCIG编译测试
nginx 设置
nginx需要在源码编译的时候加入fastcgi—module
location /test { fastcgi_pass 127.0.0.1:8001; fastcgi_index test; include fastcgi.conf; }
重新加载配置
/usr/local/nginx/sbin/nginx -s reload
测试代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "fcgi_stdio.h" int main(int argc, char *argv[]) { int count = 0; //阻塞等待并监听某个端⼝,等待Nginx将数据发过来 while (FCGI_Accept() >= 0) { //如果想得到数据,需要从stdin去读,实际上从Nginx上去读 //如果想上传数据,需要往stdout写,实际上是给Nginx写数据 printf("Content-type: text/html\r\n"); printf("\r\n"); printf("<title>Fast CGI Hello!</title>"); printf("<h1>Fast CGI Hello!</h1>"); //SERVER_NAME:得到server的host名称 printf("Request number %d running on host <i>%s</i>\n", ++count, getenv("SERVER_NAME")); } return 0; }
编译启动
root@VM-0-16-ubuntu:/usr/local/nginx/sbin# lsof -i:8001 root@VM-0-16-ubuntu:/usr/local/nginx/sbin# cd /home/workplace/0voice_tuchuang/learn_test/ root@VM-0-16-ubuntu:/home/workplace/0voice_tuchuang/learn_test# gcc fastcgi_src.c -o fastcgi_src -lfcgi root@VM-0-16-ubuntu:/home/workplace/0voice_tuchuang/learn_test# ldconfig root@VM-0-16-ubuntu:/home/workplace/0voice_tuchuang/learn_test# spawn-fcgi -a 127.0.0.1 -p 8001 -f ./fastcgi_src spawn-fcgi: child spawned successfully: PID: 5926 root@VM-0-16-ubuntu:/home/workplace/0voice_tuchuang/learn_test# lsof -i:8001 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME fastcgi_s 5926 root 0u IPv4 15752309 0t0 TCP localhost:8001 (LISTEN)
更多相关内容 -
node-fastcgi:使用node.js创建FastCGI应用程序
2021-02-05 16:19:06节点fastcgi 该模块是节点标准HTTP模块(仅服务器)的直接替代。 使用FastCGI无需更改为http服务器编写的代码即可正常工作。 它可用于构建FastCGI应用程序或将现有的节点应用程序转换为FastCGI。 该实现完全符合。... -
解决FastCGI 进程超过了配置的活动超时时限的问题
2020-12-18 19:30:32近日,需要满足测试需求,进行大数据并发测试时,报出【HTTP 错误 500.0 – Internal Server Error E:\PHP\php-cgi.exe – FastCGI 进程超过了配置的活动超时时限】 解决办法: IIS7->FastCGI设置->双击”... -
PHP7内核CGI与FastCGI详解
2021-01-03 00:06:33FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。 PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。 PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 ... -
一文读懂CGI、FastCGI、php-cgi、php-fpm的区别
2021-01-20 14:35:07一文读懂cgi、fastcgi、php-cgi、php-fpm的区别CGI诞生之前CGI的诞生CGI程序如何工作Web服务器的内置模块FastCGIphp-fpmphp-cgiphp-cgi与php-fpm的区别 CGI诞生之前 在CGI诞生之前Web服务器负责静态文件的存储、查找... -
php以fastCGI的方式运行时文件系统权限问题及解决方法
2020-10-24 06:28:34在IIS7.0上以FastCGI方式配置好PHP运行环境,测试可以正常运行PHP程序后,将PHP程序部署上去,导入程序原来的数据和配置信息。很快就有问题出来啦下面我们就详细记录下。 -
nginx FastCGI错误Primary script unknown解决办法
2021-01-10 05:15:15在centos上成功编译安装nginx 1.4、php 5.4并成功启动nginx和php-fpm后,访问php提示”File not found.”,同时在错误日志中看到: 代码如下:2013/10/22 20:05:49 [error] 12691#0: *6 FastCGI sent in stderr: ... -
Python-FastCGI-Client:用于Python的FastCGI客户端(直接与fastcgi-server(例如PHP-FPM等)进行通信)注意
2021-05-06 11:15:33Python FastCGI客户端 Python FastCGI客户端,用于通过FastCGI直接访问FastCGI Web资源 如何使用?(您应该开始FastCGI流程) from FastCGIClient import * client = FastCGIClient('127.0.0.1', 9000, 3000, 0) ... -
FastCGI 进程意外退出造成500错误
2020-10-23 21:27:11主要介绍了FastCGI 进程意外退出造成500错误的相关资料,需要的朋友可以参考下 -
golang-fastcgi-nginx:Docker 上的 nginx 服务的 Golang fastcgi
2021-06-21 02:23:19关于这个项目Golang fastcgi 在 Docker 上由 Nginx 提供服务。克隆子存储库 cd golang-fastcgi-nginxgit clone git@github.com:eyasuyuki/golang-docker.gitgit clone git@github.com:eyasuyuki/nginx.git使用 ... -
处理(php-cgi.exe – FastCGI 进程超过了配置的请求超时时限)的问题
2020-12-19 01:21:29【详细错误】:HTTP 错误 500.0 – Internal Server ErrorC:\Program Files\PHP\php-cgi.exe – FastCGI 进程超过了配置的请求超时时限【环境】:php + IIS7.5解决办法:方法一:C:\Windows\System32\inetsrv\config... -
lighttpd fastcgi
2018-07-24 11:33:565.注意fastcgi程序编译方式 进入cgi-bin目录中编译方式如下 2228 gcc -o caoft.fcgi echo.c -lpthread -lfcgi 2229 gcc -o caoft.fcgi size.c -lpthread -lfcgi 2230 gcc -o caoft.fcgi threaded.c -lpthread -... -
nginx配置、proxy_passfast 和 cgi_pass区别,反向代理,负载均衡、nginx+fastcgi+php的并发阻塞问题
2021-01-09 05:37:58目录 1、准备两个tomcat和一个nginx ...2、反向代理proxy_pass 2.1、反向代理 2.2、反向代理-使用upstream ...3、网关代理fastcgi_pass(php+nginx配合) 3.1、php安装(本人安装的是php-7.3.1) 3.1.1、php下载 3.1 -
将php默认的FastCGI模式改成ISAPI模式
2020-10-01 00:30:35将php默认的FastCGI模式改成ISAPI模式 -
fastcgi:fastcgi客户端C实现
2021-05-12 21:24:44fastcgi by c 1、修改fcgi_un.c文件中unixSocket为本机socket文件位置 2、修改fcgi_un.c文件中scriptFile为本机请求的php文件位置 3、gcc -o fcgiun fcgi_un.c 4、./fcgiun -
FastCGI支持库1.2版(FastCGI.fne)-易语言
2021-06-13 20:30:15为易语言编写IIS FastCGI程序提供便利,使用本库前需了解FastCGI的安装方法和使用方法.FastCGI下载地址:http://www.iis.net/download/FastCGI。 操作系统支持: Windows -
fastcgi文件读取漏洞之python扫描脚本
2020-12-23 13:09:01说到FastCGI,大家都知道这是目前最常见的webserver动态脚本执行模型之一。目前基本所有web脚本都基本支持这种模式,甚至有的类型脚本这是唯一的模式(ROR,Python等)。 FastCGI的主要目的就是,将webserver和动态... -
php中神奇的fastcgi_finish_request
2020-12-19 18:04:54fastcgi_finish_request(); echo ‘To be, or not to be, that is the question.’; file_put_contents(‘log.txt’, ‘生存还是毁灭,这是个问题。’); ?> 通过浏览器(不是命令行!)运行此脚本,结果发现并... -
Nginx中FastCGI如何配置优化
2021-01-11 01:13:37FastCGI: FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎... -
node-fastcgi-client:Node.js中的FastCGI客户端实现,主要设计用于PHP的累积量
2021-05-05 17:01:25节点-fastcgi-客户端 Node.js中的FastCGI客户端实现,主要设计用于PHP的累积量。 发展状况 发展。 很快就会稳定。 原料药 npm install fastcgi-client 。 使用require('fastcgi-client')获得一个fastcgiConnector 。... -
IIS7.5开启FastCGI的配置方法
2021-01-10 14:47:14之前在Windows Server 2008中配置PHP的时候安装过一个FastCGI的安装文件,今天在Windows7中安装FastCGI时却告知版本不支持,后来查了一下,原来Windows Server 2008默认是IIS7.0,IIS7.0默认不自带FastCGI,所以需要... -
Win2008 r2 IIS7.5出现FastCGI进程最近常常失败。请过一会再尝试此请求的解决方法
2021-01-10 08:48:28FastCGI 进程最近常常失败。请过一会再尝试此请求 详细错误信息 模块 FastCgiModule 通知 ExecuteRequestHandler 处理程序 PHP for FastCgi 错误代码 0x80004005 请求的 URL http://piaoyun.cc:80/index.php 物理... -
fastcgi.zip
2019-12-28 20:01:04fastcgi2.4.1 安装: ./configure make make install 现在官网已经没有了 -
windows2003 + IIS6.0 环境下以Fastcgi方式配置php .docx
2021-09-23 12:24:23windows2003 + IIS6.0 环境下以Fastcgi方式配置php .docx -
PHP(FastCGI)在Nginx的alias下出现404错误的解决方法
2020-09-30 13:53:19主要介绍了PHP(FastCGI)在Nginx的alias下出现404错误的解决方法,涉及nginx平台的相关配置技巧,需要的朋友可以参考下 -
java多线程tcpsocketserver源码-fastcgi:fastcgi
2021-06-05 07:03:32java多线程tcp socket server源码 -
fastcgi-wrappers:该存储库包含两个用Perl编写的FastCGI包装器。 第一个可以以CGI相同的方式执行任何可执行...
2021-05-23 14:38:32FastCGI包装器(原始文件来自描述的链接,即 。该文件归于Denis S菲利莫诺夫) 这些脚本旨在与Apache的mod_fcgid一起使用。 如果没有对守护代码进行注释,并且套接字已更改为TCP / IP 1,则它们也可以与nginx一起... -
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2020-10-27 03:44:13本篇文章是对解决(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题进行了详细的分析介绍,需要的朋友参考下 -
IIS+fastcgi下PHP运行超时问题的解决办法详解
2021-01-21 16:03:57每在页面中上传较大的文件时遇到FastCgi的错误:“The FastCGI process exceeded configured request timeout”,几经试验,明白了需要修改FastCgi的配置文件“fcgiext.ini”,位于目录“C:/WINDOWS/system32/...