一、Nginx、FastCGI、PHP
1.1 FastCGI是什么?
FastCGI(Fast Common Gateway Interface,快速通用网关接口),是一个可伸缩的、高速地在HTTP server和动态脚本语言间通信的接口(或者说是协议)。
1.2 FastCGI与CGI
传统的CGI接口方式的主要缺点是性能差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎不可用。
FastCGI接口方式可以将HTTP服务器和脚本解析服务器分开,在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态请求时,可以将其交付给 FastCGI进程来执行,然后将得到的结果返回给浏览器。
1.3 Nginx + FastCGI运行原理

Nginx不支持对外部程序的直接调用或者解析,所有的程序(包括PHP)必须通过FastCGI、uwsig接口调用。FastCGI接口调用在Linux下的socket(unix sockt或者ip:port 形式)。为了调用CGI程序,还需要一个FastCGI的wrapper,wrapper绑定在某个固定的socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket时,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序 处理脚本,并读取返回数据;接着wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx。最后Nginx将返回的数据发送给客户端。
1.4 PHP-FPM
FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者FastCGI引擎。PHP-FPM就是支持PHP的FastCGI引擎。PHP-FPM是一个第三方的FastCGI进程管理器,作为PHP的一个补丁进行开发的,因此在安装的时候需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中。
FastCGI 的主要优点是把动态语言和 HTTP Server 分离开来,所以 Nginx 与PHP/PHP-FPM 经常被部署在不同的服务器上,以分担前端 Nginx 服务器的压力,使 Nginx专一处理静态请求和转发动态请求,而 PHP/PHP-FPM 服务器专一解析 PHP 动态请求。
二、编译安装PHP和PHP-FPM
2.1 php安装
# tar -x -f php5.6.30.tar.xz -C /usr/src
# cd /usr/src/php-5.6.11
# ./configure --prefix=/usr/local/php --enable-fpm
# make && make install
注意:此处只是为了测试PHP在Nginx上的应用,所以编译选项只有--eanble-fpm(激活对 FastCGI 模式的 fpm 支持),FastCGI 支持默认开启
2.2 配置Nginx 反向代理
#vim nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意:启动服务时,可能会提示$document_root错误之类的,如果提示,就写全路径/usr/local/nginx/html即可 。
2.3 php-fpm 启动
Apche和Nginx对于php的支持方式是不一样的.Apache使用的是一个模块(mod_php),是直接加在Apache内核里面的,因此在Apache里面,配置文件修改之后,直接重启Apache服务就可以支持php了.而Nginx中,Nginx若是要支持PHP解析,就需要第三方的FastCGI处理器才能实现,也就是使用PHP-FPM(PHP-FPM是对FastCGI的实现).而FPM在我们编译安装时已经安装在PHP内核中了。因此,要支持PHP解析,需要启动php-fpm守护进程。在php源码包中提供了这个启动脚本
- php-fpm 配置
# cd /usr/local/php5.6.30/etc
# cp php-fpm.conf.default php-fpm.conf
# sed -i 's/;pid = run\/php-fpm.pid/pid = run\/php-fpm.pid/g' php-fpm.conf
编辑 php-fpm.conf (php-fpm的配置文件)文件,将 pid = run/php-fpm.pid 前面的注释语句去掉
- 进入php的源码包,找到php-fpm的启动配置文件
# cd <php_source>/sapi/fpm
# cp init.d.php-fpm /etc/rc.d/init.d/php-fpm # php-fpm进程管理脚本
# chmod +x /etc/rc.d/init.d/php-fpm
# chkconfig --add php-fpm
# /usr/local/php5.6.30/sbin/php-fpm #启动
2.4 测试
- 简单地index.php文文件
[root@master ~]# cat /usr/local/nginx/html/index.php
<?php phpinfo();
- 访问 http://10.10.88.20/index.php (IP是自己的主机IP)

网友评论