nginx自己不能处理PHP,它只是个web服务器,当接收到请求后,若是是php请求,则发给php解释器处理,并把结果返回给客户端。php
nginx通常是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginxhtml
1、首先咱们先初步认识下FastCGI和Ngnix+FastCGI的运行原理mysql
一、apache+PHP和ngnix+php的区别linux
apache通常是把php当作本身的一个模块来启动;而ngnix则是把http请求变量转发给php进程,即php独立进程,与ngnix通讯,这种方式叫作FastCGI运行方式。nginx
因此,apache所编译的php不能用于ngnix。web
先看一个简单的图:sql
如下这段我认为是在网络上找到的最通俗易懂的解释,我将它复制进来方便你们理解:apache
一、什么是FastCGI呢?vim
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通讯的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。centos
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能不好,由于每次HTTP服务器遇到动态程序时都须要从新启动脚本解析器来执行解析,而后将结果返回给HTTP服务器。这在处理高并发访问时几乎是不可用的。另外传统的CGI接口方式安全性也不好,如今已经不多使用了。
FastCGI接口方式采用C/S结构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。
二、Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,全部的外部程序(包括PHP)必须经过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket能够是文件socket,也能够是ip socket)。
wrapper: 为了调用CGI程序,还须要一个FastCGI的wrapper(wrapper能够理解为用于启动另外一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,经过FastCGI接口,wrapper接收到请求,而后Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据经过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据(html页面或者图片)发送给客户端。这就是Nginx+FastCGI的整个运做过程,
因此,咱们首先须要一个wrapper,这个wrapper须要完成的工做:
2、编译PHP
首先咱们先认识一个概念:php-fpm
(1)PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,能够在 http://php-fpm.org/download下载获得
(2)PHP-FPM实际上是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可使用
(3)新版的PHP已经集成了php-fpm,在./configure的时候带 –enable-fpm参数便可开启PHP-FPM
接下来咱们开始安装编译PHP
一、编译前咱们须要先安装一些php须要用到的库(我用的是centos版本的linux系统)
yum -y install gcc automake autoconf libtool make
yum -y install gcc gcc-c++ glibc
yum -y install libmcrypt-devel mhash-devel libxslt-devel \
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
krb5 krb5-devel libidn libidn-devel openssl openssl-devel
二、获取php源码包
wget http://cn2.php.net/distributions/php-5.4.7.tar.gz
三、解压并进入php目录
tar zvxf php-5.4.7.tar.gz
cd php-5.4.7
四、编译并安装
./configure --prefix=/usr/local/fastphp --enable-fpm --with-mcrypt \
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \
--enable-inline-optimization --with-bz2 --with-zlib --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
--with-gd --with-jpeg-dir
make all install
五、将php-fpm复制一份

六、将php配置文件复制一份

七、修改nginx配置文件以支持php-fpm
首先打开ngnix配置文件
vim /usr/local/ngnix/conf/ngnix.conf
在server段里加入如下代码

保存
八、启动php-fpm和ngnix
/usr/local/ngnix
/usr/local/ngnix/sbin/php-fpm
九、在根目录下建立测试文件test.php作个简单的测试

十、测试成功

php-fpm的关闭和重启须要使用信号控制,其实就跟ngnix的关闭重启同样
php-fpm 关闭:kill -INT `cat /usr/local/fastphp/var/run/php-fpm.pid`
php-fpm 重启:kill -USR2 `cat /usr/local/fastphp/var/run/php-fpm.pid`
查看php-fpm进程数:ps aux | grep -c php-fpm
Ngnix的安装请查看个人另外一篇博文
http://www.cnblogs.com/it-cen/p/4310050.html
若是您以为您能在此博文学到了新知识,请为我顶一个,如文章中有解释错的地方,欢迎指出。
互相学习,共同进步!