一.关于php-fpm
1.整个工作流程:
Nginx本身不能处理PHP请求,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。
Nginx一般是把请求发给fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理并将结果返回被Nginx。
2.什么是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服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
一般情况下,FastCGI的整个工作流程是这样的:
(1)、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的连接。
(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。
3.php-fpm
FPM(FastCGI 进程管理器)用于替换PHP FastCGI的大部分附加功能,对于高负载网站是非常有用的。
它的功能包括:
支持平滑停止/启动的高级进程管理功能;
可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini
配置文件(可取代 safe_mode 的设置);
stdout 和 stderr 日志记录;
在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
文件上传优化支持;
"慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用
ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
fastcgi_finish_request() -
特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
动态/静态子进程产生;
基本 SAPI 运行状态信息(类似Apache的 mod_status);
基于 php.ini 的配置文件。
4.4.apache+PHP和ngnix+php的区别
apache一般是把php当做自己的一个模块来启动;而ngnix则是把http请求变量转发给php进程,即php独立进程,与ngnix通信,这种方式叫做FastCGI运行方式。所以,apache所编译的php不能用于ngnix。
二.源码安装PHP
1.安装PHP用到的库
[root@localhost ~]# 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 readline-devel
2.解压缩
下载地址:
[root@localhost ~]# tar xf php-5.6.19.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/php-5.6.19/
3.创建运行fpm的用户和组(默认为www)
[root@localhost ~]# groupadd -r www
[root@localhost ~]# useradd -g www -r www
4.编译PHP
(这也是一种编译方法,还未尝试,此次用的是下面的)
./configure --prefix=/usr/local/php --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
[root@localhost php-5.6.19]# ./configure --prefix=/etc/php --with-config-file-path=/etc/php --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-opcache --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gettext --enable-mbstring --with-iconv --with-mcrypt --with-mhash --with-openssl --enable-bcmath --enable-soap --with-libxml-dir --enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-sockets --with-curl --with-zlib --enable-zip --with-bz2 --with-readline --without-sqlite3 --without-pdo-sqlite --with-pear
[root@localhost php-5.6.19]# make
[root@localhost php-5.6.19]# make install
Installing shared extensions: /etc/php/lib/php/extensions/no-debug-non-zts-20131226/
Installing PHP CLI binary: /etc/php/bin/
Installing PHP CLI man page: /etc/php/php/man/man1/
Installing PHP FPM binary: /etc/php/sbin/
Installing PHP FPM config: /etc/php/etc/
Installing PHP FPM man page: /etc/php/php/man/man8/
Installing PHP FPM status page: /etc/php/php/php/fpm/
Installing PHP CGI binary: /etc/php/bin/
Installing PHP CGI man page: /etc/php/php/man/man1/
Installing build environment: /etc/php/lib/php/build/
Installing header files: /etc/php/include/php/
Installing helper programs: /etc/php/bin/
program: phpize
program: php-config
Installing man pages: /etc/php/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /etc/php/lib/php/
[PEAR] Archive_Tar - installed: 1.4.0
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util - installed: 1.3.0
[PEAR] PEAR - installed: 1.10.1
Wrote PEAR system config file at: /etc/php/etc/pear.conf
You may want to add: /etc/php/lib/php to your php.ini include_path
/usr/local/php-5.6.19/build/shtool install -c ext/phar/phar.phar /etc/php/bin
ln -s -f phar.phar /etc/php/bin/phar
Installing PDO headers: /etc/php/include/php/ext/pdo/
以上就完成了PHP的安装;
三.整合PHP与Nginx
1.先复制一份php-fpm文件和PHP的配置文件
[root@localhost php]# cp -p /usr/local/php-5.6.19/php.ini-development /etc/php/etc/php.ini
[root@localhost etc]# pwd
/etc/php/etc
[root@localhost etc]# cp -p php-fpm.conf.default php-fpm.conf
[root@localhost php]# cp -p /usr/local/php-5.6.19/php.ini-development /etc/php/etc/php.ini
附:php-ftp.conf配置选项:
2.修改Nginx配置文件以支持php-fpm
在server段添加如下内容:
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;
}
3.创建php测试文件
[root@localhost html]# pwd
/etc/nginx/html
[root@localhost html]# vim index.php
echo phpinfo();
?>
4.启动php-fpm和Nginx
[root@localhost html]# /etc/php/sbin/php-fpm
[root@localhost html]# nginx -s reload
5.测试
6.php-fpm的启动和关闭
php-fpm同Nginx一样需要使用信号来控制,而php-fpm的master进程可以理解以下信号:
TERM,INT:立即关闭;
QUIT:平滑关闭;
USR1:重新打开日志文件;
USR2:平滑重载所有进程并重新载入配置和二进制模块;
获取php-fpm的进程信息:
[root@localhost nginx]# ps -ef | grep php-fpm
root 9101 1 0 16:59 ? 00:00:00 php-fpm: master process (/etc/php/etc/php-fpm.conf)
www 9102 9101 0 16:59 ? 00:00:00 php-fpm: pool www
www 9103 9101 0 16:59 ? 00:00:00 php-fpm: pool www
root 9144 8965 0 17:17 pts/1 00:00:00 grep php-fpm
控制php-fpm:
kill -信号 php-fpm主进程号
或者
kill -信号 `cat /xxx/.../php-fpm.pid`
参考资料:
http://www.cnblogs.com/zxpo/p/3798983.html
(PHP手册)