cgi在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序(或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。后来出现了一种更高级的方式是, web服务器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了。

fastcgi的方式是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。 
下面是我给大家整理fastcgi跟cgi的区别是


  在web服务器方面在对数据进行处理的进程方面
cgi fork一个新的进程进行处理 读取参数,处理数据,然后就结束生命期
fastcgi用tcp方式跟远程机子上的进程或本地进程建立连接要开启tcp端口,进入循环,等待数据的到来,处理数据

举一个例子: 如果你家来客人的话,你需要从屋里搬凳子给客人坐,但是如果以cgi的方式的话,凳子用完就得搬回去,等下次再来人的话又得搬出来,这样的效率就太低下了。   而用fastcgi的方式的话,客人还没到你就准备好凳子了

下面给大家讲一个案例:fastcgi在lamp中的应用

第一步:安装mysql

  1.yum --disablerepo=\* --enablerepo=c6-media install libaio //libaio-dev包的作用是为了支持同步I/O。对于数据库之类的系统特别重要

  2.拆包解压(注意这里的mysql是二进制文件)

      tar  -zxvf  mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz   -C  /usr/local/     

  3.创建链接

    ln -s mysql-5.6.15-linux-glibc2.5-x86_64/  mysql

  4.创建用户以及组

    groupadd  -r  mysql

    useradd -r -g mysql  mysql

  5.更改权限,进入mysql目录下

     chown   -R mysql:mysql  .

    ./scripts/mysql_install_db   --user=mysql

     chown  -R  root  .

     chown  -R  mysql  data

  6.生成配置文件和控制脚本

    cp my.cnf  /etc    //配置文件

    cp mysql.server   /etc/init.d/mysqld  //控制脚本

    chmod   a+x  /etc/init.d/mysqld 

    开启mysql服务,并且开机自启

    service mysqld start

    chkconfig  --add   mysqld

    chkconfig   mysqld on

  7.改变环境变量,便于使用

  vim /etc/profile

  PATH=$PATH:/usr/local/mysql/bin

  .   /etc/profile

  8.mysql库文件的输出

   echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf  

   ldconfig  //更新库文件

  9.生成说明文件

   echo "MANPATH /usr/local/mysql/man" >>/etc/man.conf

第二步:php的安装

   1.拆包解压

    tar -jxvf php-5.5.8.tar.bz2 -C /usr/local/src

  2.编译安装

         ./configure    \

         --prefix=/usr/local/php \

         --enable-fpm   \

         --enable-sockets  \

         --with-mysql=/usr/local/mysql \

         --with-mysqli=/usr/local/mysql/bin/mysql_config  \

         --enable-mbstring  \

         --enable-xml  \

         --with-png-dir \

         --with-jpeg-dir  \

         --with-zlib  \

         --with-freetype-dir \

         --with-config-file-path=/etc/php \

         --with-config-file-scan-dir=/etc/php5.d

         --disable-fileinfo

wKiom1ODlyLwWrMCAAEhbhaf6Ps059.jpg

解决办法:

   yum install libxml2

   yum install libxml2-devel -y

3.安装

 make && make install

4.php.ini 文件生成

  进入源码目录

  cp php.ini-production  /etc/php/php.ini

5. 生成 php-fpm的控制脚本,进入源码目录下

cp sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm

6.启动服务

第三步.安装httpd( 注意安装http之前首先要安装apr和apr-utils

  1.安装apr

   tar -zxvf apr-1.4.6.tar.gz -C /usr/local/src/

    ./configure --prefix=/usr/local/apr

    make  && make  install

  2.安装apr-util

   tar -zxvf apr-util-1.5.1.tar.gz -C /usr/local/src/

    ./configure --prefix=/usr/local/apr-utils --with-apr=/usr/local/apr/bin/apr-1-config

    make  &&make  install

  3.安装httpd-2.4.9

     首先要安装动态链接库

     yum --disablerepo=\* --enablerepo=c6-media install pcre-devel //动态链接库

    (PCRE库是一组实现正则表达式模式使用相同的语法和语义的Perl 5匹配函数。PCRE有其自己的本地API,以及一套包装功能,符合POSIX正则表达式API。PCRE库是免费的,即使建立专有软件。 PCRE原是为该MTA写的,但现在已被许多知名的开源项目,包括Apache,PHP,KDE,后缀,模拟,和nmap。PCRE也发现到一些众所周知的商业产品,如苹果的Safari。其他一些有趣的项目采用PCRE包括鸡肉,铁氧体,玛瑙,hypermail,Leafnode,askemos,和温岭。)

  4.拆包解压编译安装

   tar -jxvf httpd-2.4.9.tar.bz2 -C /usr/local/src/

  ./configure  \

   --prefix=/usr/local/apache  \

  --sysconfdir=/etc/httpd \ (配置路径)

   --enable-so \   (启用以dso模式加载模块)

   --enable-ssl  \

   --enable-rewrite  \ (重定向)

   --with-apr=/usr/local/apr/bin/apr-1-config \

   --with-apr-util=/usr/local/apr-utils/bin/apu-1-config \

   --with-pcre  \

   -with-z  \

   --enable-mpms-shared=all \

  注意编译的时候会出现下面错误

wKioL1ODmPihBK4PAACHslT6RvI712.jpg

解决办法:yum install openssl-devel

   make  && make install

  5.改变环境变量

  vim  /etc/profile  PATH=$PATH:/usr/local/apache/bin

  6.生成手册

    echo "MANPATH /usr/local/apache/man">>/etc/man.conf

  7.控制文件

[root@CentOS ~]# vim /etc/init.d/httpd

[root@CentOS ~]# chmod a+x /etc/init.d/httpd 

wKiom1ODma3wqt35AAF_jYa9Nxo904.jpg

wKioL1ODmY_z08c_AACofd10nus675.jpg

启动服务

8.编辑配置文件/etc/httpd/httpd.conf加入下面内容

AddType application/x-httpd-php  .php

AddType application/x-httpd-php-source  .phps

ProxyRequests Off


ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1

wKiom1ODmsfw10b1AAC-Yp48sr8323.jpg重启http服务,登陆Apache主页面,发现我们这次并没有靠模块结合

wKiom1ODm5mhuyzfAALGyhPJsJY893.jpg