Fastcgi 原理

1.关于cgi

通用网关接口Common Gateway Interface/CGI描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。

CGI 独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。

 

  1. Web服务器收到客户端(浏览器)请求http request,启动cgi程序,并通过环境变量、标准输入传递数据;
  2. Cgi进程启动解析器、加载配置(如业务相关配置)、连接其他服务器(如db服务器)、逻辑处理等;
  3. Cgi将处理结果通过标准输出,传递给web服务器;
  4. Web服务器收到cgi的返回结果,构建http response返回给客户端,并杀死cgi进程。

2. 关于fastcgi

快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减少Web服务器CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求

与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。

 

 

  1. Web服务器启动时,载入fastcgi初始化执行环境;Apachemod_fastcginginxngx_http_fastcgi_moduleLighttp的模块
  2. Fastcgi进程管理器自身初始化,启动多个cgi解释器进程并等待来自web服务器的连接。启动fastcgi进程时,可以配置unix domain socket/ip socket两种方式;
  3. 当客户端请求到达web服务器时,web服务器将请求采用socket方式转发到fastcgi主进程,fastcgi选择并连接一个cgi解释器。Fastcgi主进程将cgi环境变量和标准输入发送到fastcgi子进程;
  4. Fastcgi子进程完成处理后,将处理结果通过socket返回给web服务器。当fastcgi子进程关闭连接时,请求完成;
  5. Fastcgi子进程继续等待并处理web服务器的下一个请求。

3. cgi 和 fastcgi对比

CGI 就是所谓的短生存期应用程序, FastCGI就是所谓的长生存期应用程序。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。

4. Nginx + fastcgi

nginx不能像apache那样直接执行外部可执行程序,但nginx可以作为代理服务器,将请求转发给后端服务器,这也是nginx的主要作用之一。其中nginx就支持fastcgi代理,接收客户端的请求,然后将请求转发给后端fastcgi进程。

fastcgi进程由FastCGI进程管理器管理,而不是nginx。这样就需要一个FastCGI管理,管理我们编写fastcgi程序。本文使用spawn-fcgi作为FastCGI进程管理器。

4.1 spawn-fcgi

spawn-fcgi是一个通用的FastCGI进程管理器,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了。

spawn-fcgi使用pre-fork模型,功能主要是打开监听端口,绑定地址,然后fork-and-exec创建我们编写的fastcgi应用程序进程,退出完成工作。fastcgi应用程序初始化,然后进入死循环侦听socket的连接请求。

 

spawn-fcgi的帮助信息可以通过man spawn-fcgi或spawn-fcgi –h获得,下面是部分常用spawn-fcgi参数信息:

/opt/nginx_1.7/sbin/spawn-fcgi -a 127.0.0.1 -p 8089 -f /opt/nginx_1.7/cgi_bin/mytest.fcgi

-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置

-a <addr> 绑定到地址addr。

-p <port> 绑定到端口port。

-s <path> 绑定到unix domain socket

-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)

-P <path> 指定产生的进程的PID文件路径。

-F <childs> 指定产生的FastCGI的进程数(C的CGI用这个)

-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。

 

4.2 fastcgi应用程序

#include "fcgi_stdio.h"

#include <stdlib.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>"

        "Request number %d running on host <i>%s</i>\n",

        ++countgetenv("SERVER_NAME"));

    return 0;

}

编译g++ main.cpp -o demo –lfcgi,并将demo部署到/opt/nginx-1.7.7/cgi-bin/目录。

通过spawn-fcgi启动c/c++编写好的fastcgi程序:/opt/nginx-1.7.7/sbin/spawn-fcgi -a 127.0.0.1 -p 8081 -f /opt/nginx-1.7.7/cgi-bin/demo 

 

4.3 nginx fastcgi配置

 

根据提供的引用内容,tongweb fastcgi是指在Web服务器中使用FastCGI来处理PHP脚本的一种方法。FastCGI是一种Web服务器与应用程序之间进行通信的协议,它可以提高PHP执行效率和性能。具体工作原理如下: 1. Web服务器启动时,载入FastCGI进程管理器,并初始化多个CGI解释器进程(如php-cgi)。 2. 当客户端发送请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器(如php-cgi)。 3. Web服务器将CGI环境变量和标准输入发送到FastCGI子进程(如php-cgi)。 4. FastCGI子进程完成处理后,将标准输出和错误信息返回给Web服务器,并关闭连接。 5. FastCGI子进程接着等待并处理来自FastCGI进程管理器的下一个连接。 使用FastCGI相比传统的CGI模式,可以减少PHP脚本的解析和初始化时间,提高性能。另外,FastCGI还支持持久化数据库连接,可以更好地处理数据库操作。 关于tongweb fastcgi的具体配置,可以在配置文件中添加相应的设置。如在lighttpd.conf配置文件中,可以使用命令"include "conf.d/fastcgi.conf""将fastcgi.conf文件的内容包含进来。而在fastcgi.conf文件中,可以配置相关的参数和选项来实现FastCGI的具体设置。 综上所述,tongweb fastcgi是一种通过FastCGI来处理PHP脚本的方法,可以提高PHP的执行效率和性能。具体的配置和设置可以在相应的配置文件中完成。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值