PHP-FPM 的管理和配置详解


Posted in PHP onFebruary 17, 2019

PHP-FPM 是什么?

PHP-FPM 是 FastCGI 的进程管理器。

PHP-FPM 的特点

  • 支持平滑停止、启动的高级进程管理功能
  • 动、静态子进程产生
  • 慢日志,记录脚本运行所导致的异常缓慢
  • 可以监听不同的端口和使用不同的 php.ini

几个概念的理解

1)、CGI

CGI全称“公共网关接口”(Common Gateway Interface),是HTTP服务器与其它机器上的程序进行通信的接口,其程序须运行在网络服务器上。 

NOTE:CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。

2)、FastCGI

FastCGI是一个常驻型的CGI,它可以一直执行,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。我们知道,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,那么就可以提供良好的性能、伸缩性等。

优点:

1.  FastCGI具有语言无关性;

2.  FastCGI独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。而恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥;

3.  FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的;

4.  FastCGI不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变;

缺点:

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

上面的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)。

原理:

1.  Web服务器启动时,载入FastCGI进程管理器;

2.  FastCGI进程管理器初始化,启动多个CGI解释器进程(PHP-CGI)并等待来自Web服务器的连接;

3.  当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器,Web服务器将CGI环境变量和标准输入发送到FastCGI子进程PHP-CGI。

4.  FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回给Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。而在CGI模式中,PHP-CGI在此便退出了。

在上述情况中,可以想象CGI通常有多慢,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。另外,数据库持久连接可以工作。 

NOTE:FastCGI的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。 

3)、PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。

PHP-CGI的不足:

1.  php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。

2.  直接杀死php-cgi进程,php就不能运行了(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑重新生成新的子进程)。

4)、Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3可以直接使用PHP-FPM了。

Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。最新的lighttpd也没有包含这一块了(http://www.lighttpd.NET/search?q=Spawn-FCGI),但可以在以前版本中找到它。在lighttpd-1.4.15

版本中就包含了(http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz),目前Spawn-FCGI的下载地址是http://redmine.lighttpd.Net/projects/spawn-fcgi,最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz。

NOTE:最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。

5)、对比Spawn-FCGI

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载

结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。

Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

PHP-FPM 的管理和配置

PHP-FPM 管理

master 主进程理解以下信号:

  • INT,TERM 立刻终止
  • QUIT 平滑终止
  • USR1 重新打开日志文件
  • USR2 平滑重载所有 worker 进程并重新载入配置和二进制模块
# 查看 php-fpm 用户
ps aux | grep php-fpm

# 查看 php-fpm 进程 pid
ps -ef | grep php-fpm

# 启动 php-fpm
php-fpm -D

# 关闭 php-fpm
kill -INT [pid]

# 重启 php-fpm
kill -USR2 [pid]

ps 是展示当前进程的快照。

PHP-FPM 配置

/etc/php-fpm.d 文件夹中包含了所有进程池的配置,在主配置文件 /etc/php-fpm.conf 中有下面一行:

include=/etc/php-fpm.d/*.conf

php-fpm.conf 的主配置文件包含全局配置,子配置是不同进程池的配置,例如 www。

全局配置

# s 秒,m 分,h 小时,d 天

# 子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动
emergency_restart_threshold 10
# 平滑重启的间隔时间:
emergency_restart_interval 1m
# 子进程接受主进程复用信号的超时时间
process_control_timeout 10s

进程池配置

# 接收 FastCGI 请求的地址
listen: 'ip:port', '/path/to/unix/socket'

# 设置进程管理器如何管理子进程
pm: static 固定数量, ondemand 进程在有需求时才产生, dynamic 动态设置

static 和 dynamic 配置

内存比较少,并发量不是很大的应用,可以考虑采用 dynamic 的方式,这样可以控制 php-fpm 所消耗的总内存数。

在并发高或者流量波动大的情况下,使用 static 可以在高并发下获得比 dynamic 更快的响应速度。

可配置进程数量 = php-fpm 可配置内存 / (php-fpm 子进程的内存占用 * 1.2)

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
phpfans留言版用到的数据操作类和分页类
Jan 04 PHP
php feof用来识别文件末尾字符的方法
Aug 01 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
如何使用php输出时间格式
Aug 31 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 PHP
php单链表实现代码分享
Jul 04 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
PHP fprintf()函数用法讲解
Feb 16 #PHP
PHP explode()函数用法讲解
Feb 15 #PHP
php二维数组按某个键值排序的实例讲解
Feb 15 #PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 #PHP
You might like
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php中session使用示例
2014/03/29 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
php实现session共享的实例方法
2019/09/19 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
js实现tab切换效果
2017/02/16 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python numpy数组中的复制知识解析
2020/02/03 Python
学习委员自我鉴定
2014/01/13 职场文书
市级文明单位申报材料
2014/05/07 职场文书
禁毒宣传标语
2014/06/19 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
采购部2015年度工作总结
2015/07/24 职场文书