什么是CGI
CGI(Common Gateway Interface)是一个标准协议,它为web服务器提供了一个标准的协议,以便于服务器能够像运行命令行接口程序那样来运行第三方程序,这些第三方程序能够动态地生成web页面。这些第三方程序被称为CGI脚本(知足CGI定义的程序),或者简称CGIs。至于这些CGI程序是如何被执行的则是由服务器决定的。在通常状况下,CGI脚本在接收到web请求能动态地生成HTML。 php
为何会有CGI
正如浏览器会将请求信息发送给web服务器,web服务器在须要CGI程序时也会将一些必要的信息传递给CGI程序。相应的,当CGI程序运行完后也须要将一些信息返回给web服务器,这些信息包括了http相应中的一些内容,例如:当前请求的响应状态,返回的内容类型(e.g. HTML, PDF, or plain text)等等。 html
在很早以前,不一样的web服务器会使用不一样的方法去跟CGI程序交换信息,这使得CGI程序的通用性不强(根据不一样的web服务器须要相应的修改CGI程序)。所以CGI诞生了,它定义了一些通用的方法的来规范web服务器和CGI程序之间的信息交流。早期CGI程序主要被用来处理HTML表单。nginx
webserver与CGI程序的链接
在web服务器中每每能够配置哪些url须要被CGI程序来处理。这一般是经过规定服务器某些目录是属于CGI程序的(这个目录对应着某种形式的url,例如“http://example.com/cgi-bin/pr...”这个url对应着cgi-bin这个目录,所以服务器知道这个请求须要被CGI程序来处理)web
web服务器经过将必要的信息存储在环境变量中,而CGI程序则从环境变量中获取这些必要信息,所以能够实现两者之间的信息交换。CGI程序处理完后,本来发送到“标准输出”的信息会被转到web服务器,服务器再将结果返回给客户端。apache
如下这些参数大可能是CGI标准规定,须要由web服务器传递给CGI程序的(经过前面所说的“环境变量”的方式):segmentfault
Server specific variables: SERVER_SOFTWARE: HTTP服务器的 name/version SERVER_NAME: 服务器的主机名(也能够是IP地址) GATEWAY_INTERFACE: CGI/version. Request specific variables: SERVER_PROTOCOL: HTTP/version. SERVER_PORT: TCP 端口. REQUEST_METHOD: HTTP请求方式(GET,POST等). PATH_INFO: 路径后缀 PATH_TRANSLATED: 若是PATH_INFO存在的话,该参数表明相应的在服务器上的绝对路径。 SCRIPT_NAME: 相应的到程序的路径(例如/cgi-bin/script.cgi) QUERY_STRING: URL中“?”后后面接着的那部分。这些请求字符串(query string)一般以“name=value”的形式出现(例如var1=val1&var2=val2...) REMOTE_HOST: 客户端的主机名 REMOTE_ADDR: 客户端的ip地址。 AUTH_TYPE: 认证类型(若是可用的话) REMOTE_USER :与AUTH_TYPE相关 REMOTE_IDENT: see ident, only if server performed such lookup. CONTENT_TYPE: Internet media type of input data if PUT or POST method are used, as provided via HTTP header. CONTENT_LENGTH: similarly, size of input data (decimal, in octets) if provided via HTTP header. 其余与user agent相关的参数(一般就是浏览器) :HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE
CGI的缺点
每次请求都要启动一个CGI程序,相对于一次请求处理,启动过程的性能消耗占整个过程的消耗比例不小,所以若是每次请求都须要启动一个新的CGI程序来处理,明显在性能上是低效的。浏览器
CGI的替代方案
因为上面提到的CGI的缺点,出现了如下这些替代方案:服务器
什么是FastCGI
FastCGI是在CGI标准协议上发展出来的一个变种协议,它的主要目标是减轻web服务器与CGI程序之间交互时的负载,这样一台服务器就能够在同一时间处理更多的web请求。dom
FastCGI的实现细节
与CGI每次处理一个请求时都启动一个新的CGI程序不一样,FastCGI使用一些常驻内存的CGI进程来处理源源不断的请求。这些CGI进程是由FastCGI管理进程(FastCGI server)来管理,而非web服务器。当接收到一个web请求时,web服务器把一些必要的信息和页面请求自己经过Unix域套接字( Unix domain socket),或命名管道(named pipe ),或TCP链接( TCP connection)发送给FastCGI进程(至于发给哪一个CGI进程则是由FastCGI管理进程来分配)。经过相同的链接方式,web响应返回给web服务器。响应返回后,本次链接可能会被关闭掉,可是web服务器和这些处理请求的CGI进程会继续驻留在内存中,等待处理下一个请求。所以,每个CGI进程在它的生命周期内能够处理不少个web请求,而不是像CGI那样只能处理一个web请求。socket
什么是php-fpm
PHP-FPM (FastCGI Process Manager)是FastCGI在PHP上的具体实现,从PHP5.3.3开始,已经被集成到PHP的安装包中。
具体配置能够参考:
https://segmentfault.com/q/10...
http://php.net/manual/en/inst...
一般使用FastCGI方式
具体配置参考
https://segmentfault.com/a/11...
http://php.net/manual/en/inst...
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
http://php.net/manual/en/inst...