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
解决办法:
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 \
注意编译的时候会出现下面错误
解决办法: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
启动服务
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
重启http服务,登陆Apache主页面,发现我们这次并没有靠模块结合