fastcgi

CGI

CGI(Common Gateway Interface)通用网关接口,是Web服务器与Server进行数据传递的一种标准协议.
Server每次接收到Web服务器的一个CGI请求后fork一个子进程去exec特定的CGI程序,Server收到的参数通过环境变量传递,在fork后对子进程的标准输入/标准输出/标准错误输出进行重定向,重定向到父进程生成的IPC文件描述符.exec特定的CGI程序,替换成功后等待子进程的运算结果,受到结果将其返回给浏览器.其中Web服务器和Server的通信通过标准输入/标准输出/标准错误输出进行,Server从标准输入读取参数,向标准输出输出数据即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Web浏览器       -->        Web服务器           -->             Server
1.Http Request 2.stdin |
子进程的创建
|
CGI协议解析
|
CGI程序exec
|
环境变量读取
|
标准输入标准输出标准错误输出重定向
|
CGI协议解析
|
Web浏览器 <-- Web服务器 <-- 逻辑处理
4.Http Response 3.stdout/stderr |
退出

CGI程序每处理一个请求都需要创建子进程,然后exec特定的CGI程序,处理完请求子进程自动退出,消耗大量系统资源,性能太差

FastCGI

FastCGI是CGI的优化版本,FastCGI再程序启动之初就fork多个子进程,阻塞等待Web服务器的请求,处理完一个请求后不退出,继续阻塞等待下一个请求,通信方式可以使用TCP连接,跨服务器
fastcgi

spawn-fcgi

spawn-fcgi是一个开源的小程序,用来管理fast-cgi进程,简单小巧.
spawn-fcgi的github地址github.com/lighttpd/spawn-fcgi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ spawn-fcgi
Usage: spawn-fcgi [options] [-- <fcgiapp> [fcgi app arguments]]
spawn-fcgi v1.6.3 (ipv6) - spawns FastCGI processes
Options:
-f <path> filename of the fcgi-application (deprecated; ignored if
<fcgiapp> is given; needs /bin/sh)
-d <directory> chdir to directory before spawning
-a <address> bind to IPv4/IPv6 address (defaults to 0.0.0.0)
-p <port> bind to TCP-port
-s <path> bind to Unix domain socket
-M <mode> change Unix domain socket mode
-C <children> (PHP only) numbers of childs to spawn (default: not setting
the PHP_FCGI_CHILDREN environment variable - PHP defaults to 0)
-F <children> number of children to fork (default 1)
-P <path> name of PID-file for spawned process (ignored in no-fork mode)
-n no fork (for daemontools)
-v show version
-?, -h show this help
(root only)
-c <directory> chroot to directory
-S create socket before chroot() (default is to create the socket
in the chroot)
-u <user> change to user-id
-g <group> change to group-id (default: primary group of user if -u
is given)
-U <user> change Unix domain socket owner to user-id
-G <group> change Unix domain socket group to group-id

spawn-fcgi.c注释

fastcgi

fastcgi的阉割版本,只保留Linux环境下的代码,加入注释
缺点:所有操作都是阻塞的,一个进程同时只能处理一个请求,和web服务器之间的通信只能使用短链接

协程FastCGI

从fastcgi-async-or-coroutine修改而来的cocgi
和腾讯的libco相结合,单进程可同时处理多个请求,增加了协程动态新增和销毁的功能

异步FastCGI

从fastcgi-async-or-coroutine修改而来的mucgi
借助muduo库,使用I/O复用技术,单进程可以处理多个请求,缺点在于对后端的访问还是同步方式的话会阻塞整个进程