PHP-FPM多方面调优策略

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: PHP-FPM多方面调优策略

FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。比方说: 支持平滑停止/启动的高级进程管理功能、文件上传优化支持、stdoutstderr 日志记录等等,更多请移步官网 https://www.php.net/manual/zh/install.fpm.php

CGI到PHP-FPM

这个东西还得从 cgi 说起,慢慢的我们使用起来了 php-fpm

  • CGI

common gateway interface (公共网关接口),每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不适合了。于是就有了fastcgi

  • FastCGI

像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)

在启动FastCGI的时候它就启动了多个 CGI 解释器进程并等待Web Server来连接,结束完就又重新接客,在CGI模式中,php-cgi在此便退出了。

  • PHP-FPM

它就是FastCGI的实现,并提供了进程管理的功能,进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),

每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

多方面调优

php.ini 配置

  • 配置文件 /etc/php/7.2/fpm/php.ini
;这个是配置禁用危险函数
disable_functions=eval... 
;上传文件大小限制
post_max_size =16M
upload_max_filesize= 16M
;脚本执行时间限制
max_execution_time= 60
max_input_time =60
;脚本内存限制,一般设为128M,如非必要(无可避免的上传大文件/处理大数组)不增加
memory_limit =128M

php-fpm 配置

  • 配置文件 /etc/php/7.2/fpm/php-fpm.conf
;错误日志处理
error_log =/var/log/php-fpm/error.log
log_level = notice
;异常自启(表示60s内出现 60次 SIGSEGV orSIGBUS 异常时候,自动重启)
emergency_restart_threshold= 60
emergency_restart_interval= 60s
;设置子进程接受主进程复用信号的超时时间
process_control_timeout= 0
;后台执行php-fpm
daemonize = yes

pool 资源池配置

  • 配置文件 /etc/php/7.2/fpm/pool.d/*.conf

(每个文件代表一个资源池,机器性能足够时候,可以区分多个资源池,隔绝不同的php应用),默认是 www.conf

既然是进程管理器,当然这个进程是很重要的,这里我也不禁回想起我刚刚搞PHP的时候,当时不了解这个PHP-FPM,老是前端请求接口,一下子就挂了,后看日志才发现,是进程就没设置过,所以这里需要说明一下,这个进程怎么设置才是合理的

;监听方式,用tcp方式较稳定
listen = 127.0.0.1:9000
;backlog,排队长度设置
listen.backlog = 4096
;慢处理日志,表示超过45秒则记录为慢处理
request_slowlog_timeout = 45s
slowlog = /var/log/php-fpm/www-slow.log

重点 进程设置问题

在设置资源池的时候,有很多pm的配置

  • pm

pm默认是dynamic 动态的,但是一般我们的生产环境都是静态的,pm=static

  • pm.max_children

最大子进程数量,越多越好,但是需要根据我们的服务器来设置,一般每个php-cgi所耗费的内存为20M ~ 30M,如果最大数量设置为100,则在峰值的时候php-cgi所耗内存在2000M ~ 3000M ,如果这个值设置的比较小,那么等待的请求时间会出现502超时,可以根据你们服务器运行的程序,计算出剩余内存,再计算子进程数

  • pm.max_requests

为避免内存泄露,php-fpm有这么一个机制,当一个php-cgi进程处理的请求数达到这个配置后,则会自动重启该进程,所以在高并发中,经常导致502错误,解决方法就是把这个值设置大一些,减少进程重启次数,减少高并发情况下502错误。我一般设置为1024

  • pm.min_spare_servers

保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程,一般可以设置为10

  • pm.max_spare_servers

保证空闲进程数最大值,如果空闲进程大于此值,此进行清理,一般可以设置为30

  • request_terminate_timeout

单个请求的超时中止时间,超时后会终止进程,nginx发现信号断了,就会给客户端返回502错误。

和php.ini的max_execution_time配置不冲突,谁先达到时间谁先起作用。由于程序中有请求第三方接口等待,所以建议这个值设置为400秒,长一点不会出现502错误

希望大家看完后可以选择合适的配置来用于项目的生产环境。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6天前
|
缓存 API PHP
PHP性能优化:从基础到高级策略####
深入探索PHP性能优化的多维度策略,本文旨在揭示通过代码优化、配置调整与现代最佳实践相结合的方式,显著提升PHP应用的响应速度和资源利用率。不涉及传统摘要细节,直接聚焦于技术深度与实用技巧,引领读者踏上PHP性能调优的高效之旅。 ####
|
2月前
|
缓存 监控 测试技术
php-fpm优化调优
php-fpm优化调优
|
2月前
|
监控 IDE PHP
php xdebug的配置、调试、跟踪、调优、分析
php xdebug的配置、调试、跟踪、调优、分析
|
3月前
|
安全 前端开发 PHP
构建与验证表单:传统PHP与Laravel框架的比较分析——探索Web开发中表单处理的优化策略和最佳实践
【8月更文挑战第31天】在 Web 开发中,表单构建与数据验证至关重要。传统 PHP 方法需手动处理 HTML 表单和数据验证,而 Laravel 框架则提供了一种更现代、高效的解决方案。本文通过对比传统 PHP 和 Laravel 的方法,探讨表单构建与验证的最佳实践。Laravel 通过简洁的语法糖、内置的数据过滤和验证机制,显著提升了代码的安全性和可维护性,适用于大型项目或需要快速开发的场景。然而,在追求灵活性的小型项目中,直接使用 PHP 仍是不错的选择。了解两者的优劣,有助于开发者根据项目需求做出最佳决策。
38 0
|
3月前
|
安全 Java 云计算
JSF 应用究竟何去何从?云端部署能否成为其全新突破点?快来一探究竟!
【8月更文挑战第31天】本文介绍了将JavaServer Faces(JSF)应用部署到云平台的过程。首先,根据成本、功能、可靠性和安全性选择合适的云平台。接着,展示了构建简单JSF应用的示例代码。最后,以AWS Elastic Beanstalk为例,详细说明了部署流程。部署至云端可提升应用的可用性、扩展性和安全性。
45 0
|
4月前
|
缓存 算法 PHP
PHP性能优化策略与实践
在当今Web开发中,PHP作为一种高效灵活的服务器端脚本语言,广泛应用于各种Web应用程序中。本文探讨了提升PHP应用性能的关键策略和实践方法,涵盖了代码优化、缓存策略、数据库优化以及服务器配置等方面,旨在帮助开发者有效地提升PHP应用的响应速度和整体性能。 【7月更文挑战第9天】
34 1
|
5月前
|
缓存 应用服务中间件 PHP
PHP性能优化策略与实践
PHP作为一种广泛应用于Web开发的脚本语言,在实际应用中面临着性能优化的挑战。本文探讨了几种PHP性能优化的策略与实践,包括代码优化、缓存机制、数据库优化以及服务器配置等方面,旨在帮助开发者更好地理解和应用这些优化技术,提升PHP应用程序的性能和响应速度。
53 1
|
6月前
|
编译器 数据处理 PHP
深入理解PHP 8.0的新特性及性能优化策略
【5月更文挑战第18天】本文将详细介绍PHP 8.0的新特性以及如何利用这些新特性进行性能优化。我们将从JIT编译器、联合类型、名称参数和匹配表达式等方面进行深入探讨,并通过实例分析如何在实际项目中应用这些新特性来提高代码的执行效率。
|
6月前
|
缓存 算法 PHP
深入PHP内核:探索高性能代码优化策略
【5月更文挑战第27天】 在本文中,我们将深入探讨PHP的内核机制,并分析如何通过理解其工作原理来优化我们的代码。文章将聚焦于几个关键领域,包括解释器执行流程、内存管理、以及代码编写最佳实践等。我们的目标是为开发者提供实用的指导,帮助他们写出更加高效和稳定的PHP应用程序。
|
6月前
|
编译器 PHP
深入理解PHP 8.0的新特性及性能优化策略
在这篇文章中,我们将深入探讨PHP 8.0的新特性以及如何利用这些新特性进行性能优化。我们将详细解析JIT编译器,命名参数,联合类型,匹配表达式等新特性,并通过实例代码展示如何在实际开发中应用这些新特性来提升代码的执行效率和可读性。