PHP-FPM管理与配置详解(FastCGI进程管理器)
什么是PHP-FPM?
PHP-FPM 是 FastCGI 的进程管理器。
PHP-FPM 功能
- 支持平滑停止和启动的高级进程管理功能
- 动态和静态子进程生成
- 慢速日志,记录运行脚本引起的异常缓慢端口和php的使用.ini
理解一些概念
1),CGI
CGI的全称是“通用网关接口”(Common Gateway Interface),它是HTTP服务器与其他机器上的程序之间的连接通信接口,程序必须运行在网络服务器上。
注意:CGI 可以用任何语言编写,只要该语言具有标准输入、输出和环境变量即可。
2),FastCGI
FastCGI是常驻CGI。它可以一直执行。只要激活了,就不会每次都花时间去分叉(这是最受诟病的分叉——而且来自CGI)。 - 执行模式)。它还支持分布式计算,即FastCGI程序可以在网站服务器以外的主机上执行,并接收来自其他网站服务器的请求。
FastCGI 是一个独立于语言的 CGI 开源扩展。它的主要行为是将CGI解释器进程保留在内存中,从而获得更高的性能。我们知道,CGI解释器的重复加载是CGI性能不佳的主要原因。如果CGI解释器存储在内存中并被FastCGI进程管理器接受,那么它可以提供良好的性能、可扩展性等。
优点:
1。 FastCGI 是无语言的;
2。 FastCGI 独立于核心 Web 服务器运行,提供比 API 更安全的环境。 API 将应用程序代码与核心 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 MB 的内存。这个数字乘以 50 或 100 就是一个很大的内存量。
Nginx 0.8.46+PHP 5.2.14 (FastCGI) 服务器拥有 30,000 个并发连接。 Nginx 10个进程开始使用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(版本6)好十倍的Web服务器。
原则:
1.当Web服务器启动时,它会加载FastCGI进程管理器;
2。 FastCGI进程管理器启动,启动一些CGI解释器进程(PHP-CGI)并等待来自Web服务器Connection的消息;
3。当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器,Web服务器将CGI环境变量和标准输入发送到FastCGI PHP-CGI子进程。
4。 FastCGI子进程完成处理后,它会从同一连接将标准输出和错误信息返回到Web服务器。当FastCGI子进程关闭连接时,请求被处理。然后,FastCGI 子进程等待并处理来自 FastCGI 进程管理器(在 Web 服务器上运行)的下一个连接。在CGI模式下,PHP-CGI在此退出。
在上面的情况下,你可以想象CGI通常有多慢。对 PHP 的每个 Web 请求都必须重新解析 php.ini,填写所有扩展名,并重新初始化所有数据结构。使用 FastCGI,所有这一切仅在进程启动时发生一次。此外,数据库持久连接也有效。
注意: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的一个缺点是需要重新编译,这会对一些已经运行的环境带来相当大的风险(参考)。 PHP 直接在 PHP 5.3.3 -FPM 中运行。
Spawn-FCGI 现在是一个单独的项目,更加稳定,并且可以轻松配置许多网站。许多网站都会搭配 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 。广州。
注意:对于最新的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 1 重新打开日志文件
- USR2 优雅地上传所有工作进程并上传配置和二进制模块
# 查看 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 动态设置
静态和动态配置
对于内存比较小、并发量较低的应用,可以考虑使用动态方式,这样可以控制 php-fpm 消耗的总量的记忆。
在高并发或者流量波动较大的情况下,使用静态比动态在高并发下可以获得更快的响应。
可配置进程数=php-fpm可配置内存/(php-fpm子进程内存占用*1.2)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。