共计 3802 个字符,预计需要花费 10 分钟才能阅读完成。
Nginx 本身不能处理 PHP,它只是个 web 服务器,当接收到请求后,如果是 php 请求,则发给 php 解释器处理,并把结果返回给客户端。
Nginx 一般是把请求发 fastcgi 管理进程处理,fascgi 管理进程选择 cgi 子进程处理结果并返回被 Nginx。
一、首先我们先初步认识下 FastCGI 和 Ngnix+FastCGI 的运行原理
1、apache+PHP 和 ngnix+php 的区别
apache 一般是把 php 当做自己的一个模块来启动;而 ngnix 则是把 http 请求变量转发给 php 进程,即 php 独立进程,与 ngnix 通信,这种方式叫做 FastCGI 运行方式。
所以,apache 所编译的 php 不能用于 ngnix。
先看一个简单的图:
以下这段我认为是在网络上找到的最通俗易懂的解释,我将它复制进来方便大家理解:
1、什么是 FastCGI 呢?
FastCGI 是一个可伸缩地、高速地在 HTTP server 和动态脚本语言间通信的接口。多数流行的 HTTP server 都支持 FastCGI,包括 Apache、Nginx 和 lighttpd 等。同时,FastCGI 也被许多脚本语言支持,其中就有 PHP。
FastCGI 是从 CGI 发展改进而来的。传统 CGI 接口方式的主要缺点是性能很差,因为每次 HTTP 服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后将结果返回给 HTTP 服务器。这在处理高并发访问时几乎是不可用的。另外传统的 CGI 接口方式安全性也很差,现在已经很少使用了。
FastCGI 接口方式采用 C / S 结构,可以将 HTTP 服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当 HTTP 服务器每次遇到动态程序时,可以将其直接交付给 FastCGI 进程来执行,然后将得到的结果返回给浏览器。这种方式可以让 HTTP 服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
2、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 需要完成的工作:
1. 通过调用 fastcgi(库)的函数通过 socket 和 ningx 通信(读写 socket 是 fastcgi 内部实现的功能,对 wrapper 是非透明的)
2. 调度 thread,进行 fork 和 kill
3. 和 application(php)进行通信
二、编译 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
1、编译前我们需要先安装一些 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
2、获取 php 源码包
wget http://cn2.php.net/distributions/php-5.4.7.tar.gz
3、解压并进入 php 目录
tar zvxf php-5.4.7.tar.gz
cd php-5.4.7
4、编译并安装
./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
5、将 php-fpm 复制一份
6、将 php 配置文件复制一份
7、修改 nginx 配置文件以支持 php-fpm
首先打开 ngnix 配置文件
vim /usr/local/ngnix/conf/ngnix.conf
在 server 段里加入以下代码
保存
8、启动 php-fpm 和 ngnix
/usr/local/ngnix
/usr/local/ngnix/sbin/php-fpm
9、在根目录下创建测试文件 test.php 做个简单的测试
10、测试成功
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.linuxidc.com/Linux/2015-03/114655.htm
————————————– 分割线 ————————————–
CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里