php-fpm优化总结经验分享

目录
  • Nginx 与 php-fpm 运行流程
  • Nginx 与 php-fpm 通信机制
  • php-fpm 进程管理
  • php-fpm 优化
    • php.ini 优化
    • php-fpm.conf 优化
  • 如何避免程序 hang 死

Nginx 与 php-fpm 运行流程

  • Nginx 查看 nginx.conf 配置文件
  • 加载 nginx 的 fast-cgi 模块
  • php-fpm 监听 127.0.0.1:9000
  • php-fpm 接收到请求,启用 worker 进程处理请求
  • php-fpm 处理完请求,返回给 nginx
  • nginx 将结果通过 http 返回给浏览器\

Nginx 与 php-fpm 通信机制

  www.test.com
        |
        |
      Nginx
        |
        |
路由到 www.test.com/index.php
        |
        |
加载 nginx 的 fast-cgi 模块
        |
        |
fast-cgi 监听 127.0.0.1:9000 地址
        |
        |
www.test.com/index.php 请求到达 127.0.0.1:9000
        |
        |
     等待处理...

Nginx 与 php-fpm 的结合

  • 在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。
  • tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。
  • Unix socket 又叫 IPC (inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx 配置文件中填写 php-fpm 的 socket 文件位置。

两种方式的数据传输过程如下图所示:

php-fpm 进程管理

php-fpm 采用的是 master-worker 的进程方式。其中,

  • master 负责监听端口,等待链接;其次,注册信号,可以通过信息好 master 进行管理
  • worker 负责处理具体的逻辑
    查看 php-fpm 日志信息
  • 默认路径 -/usr/local/php/var/log

php-fpm 优化

php.ini 优化

//默认情况下服务器对上传文件的大小是有限制的,如果想修改上传文件的限制可以修改php.ini文件
file_uploads = On; //是否允许上传文件
upload_max_filesize = 1024M; //上传文件的最大限制
post_max_size = 1024M; //通过post提交的最多数据
max_execution_time = 300; //脚本最长的执行时间 单位为秒
max_input_time = 30000; //接收提交的数据的时间限制 单位为秒
memory_limit = 256M; //每个脚本使用的最大内存  ;在安全模式下,你不能用ini_set()在运行时改变这个设置。

php-fpm.conf 优化

(1)进程数设置

 pm = dynamic
 pm.max_children = 15  //静态方式下开启的php-fpm进程数量
 pm.start_servers = 5    //动态方式下的起始php-fpm进程数量
 pm.min_spare_servers = 5 //动态方式下 空闲时间最小的php-fpm进程
 pm.max_spare_servers = 5 //动态方式下 空闲时间最大的php-fpm进程

(2)最大处理请求数

最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn新的。

该配置可以避免php解释器自身或程序引起的memory leaks。

默认值是500, pm.max_requests = 1024 这样的规划,1秒钟

最大请求数:15*1024=15360 最小请求数:5*1024=7120

如何避免程序 hang 死

方法 1:设置 php-fpm 执行的超时时间为固定值

vi php-fpm.conf 修改为request_terminate_timeout = 60

方法 2:定时 reload php-fpm

在负载较高的服务器上定时重载 php-fpm

reload 可以平滑重启而不影响生产系统的 php 脚本运行,每 15 分钟 reload 一次

0-59/15 * * * * /usr/local/php/sbin/php-fpm reload

方法 3:优化进程池配置

php-fpm 根据配置文件内容和实际情况,动态创建子进程来处理请求。

当达到能够创建的最大值时,只能阻塞。一个个地进行执行。

进程数优化

pm = dynamic
pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35

最大请求数优化

pm.max_requests = 10240

提示:这个用来处理因为 PHP 解析器或引用的第三方库时,造成的内存泄露问题。

最大请求数:指一个 php-fpm 的工作进程在处理多少个请求后就终止掉。

最长执行时间优化(php.ini)

request_terminate_timeout = 20

提示:这个是用来处理因为 PHP 执行时间超长而报 502 错误的解决。

这个时长配置可以在 php.ini(max_execution_time)或 php-fpm.conf 中配置均可,为了不影响全局配置,可在 php-fpm.conf 中实现 crontab 定时任务把 php-fpm 平滑重启,这种方式就是使用 crontab 定时任务去定时查询网站是否 502 了,如果 502 了,就把 php-fpm 平滑重启

首先在 /root/ 目录下面创建脚本

vim restart-php-fpm.sh

然后给这个脚本赋予执行权限

chmod +x /root/restart-php-fpm.sh

然后就是编写脚本内容了,上代码

#!/bin/bash
MY_URL="http://www.****.com/"
RESULT=`curl -I $MY_URL|grep "HTTP/1.1 502"`
if [ -n "$RESULT" ]; then
 /etc/init.d/php7.2-fpm restart
fi

注意:

我是使用的 /etc/init.d/php7.2-fpm restart 这种方式重启的

然后编写定时任务

crontab -e
/root/restart-php-fpm.sh

用 crontab -l 查看定时任务列表

以上就是php-fpm优化总结经验分享的详细内容,更多关于php-fpm优化经验的资料请关注我们其它相关文章!

时间: 2022-08-17

PHP-FPM的配置与优化讲解

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,用于管理 PHP 进程池.接收和处理 Web 服务器的请求.PHP-FPM 会创建一个主进程,控制何时以及如何把 HTTP 请求转发给一个或多个子进程处理. 全局配置 emergency_restart_threshold = 60(建议值) 如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGB

Nginx使用的php-fpm的两种进程管理方式及优化

PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache

nginx php-fpm 小VPS 优化

小VPS受系统资源的限制,访问量过大,超过系统所能承受的极限时,有一部分请求就会502了.在系统资源够用的情况,优化nginx,php-fpm,以及系统本身,达到2个目的: 1,合理配置系统资源,将有限的资源,最大化利用.好钢用在刀刃上. 2,尽量减少磁盘的I/O 一,系统主要资源 [root@xxxxxx nginx]# free -m total used free shared buffers cached Mem: 994 815 179 0 43 118 -/+ buffers/cac

linux下的php-fpm参数配置介绍与参数优化说明

php-fpm.conf重要参数详解 pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log #错误日志,默认在安装目录中的var/log/php-fpm.log log_level = notice #错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息).

PHP-FPM实现性能优化

简介: PHP-FPM 是一个 PHP FastCGI 管理器,一般 Nginx 上面跑 PHP 程序都会将 PHP 程序丢给 PHP-FPM 来解析.好了,就这样! PHP 5.4 开始集成了 PHP-FPM ,也就是说编译 PHP 时,只要 --enable-fpm 就装好了 PHP-FPM . 一.安装 PHP-FPM shell > ./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php -

Go程序性能优化及pprof使用方法详解

Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低.反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量. Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof. 对于 pprof 的使用要分成下面两部分来说. Web 程序使用 pprof

SQLite 性能优化实例分享

最早接触 iOS 开发了解到的第一个缓存数据库就是 SQLite,后面一直也以 SQLite 作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特定场景的较多数据批量读写做了一个性能优化,使性能提高了十倍. 大致应用场景是这样: 每次程序启动会从服务器拉取一些数据,对本地数据库两个表进行同步更新,不存在就写入,存在就更新其字段.数据少的时候几十条,多的上千条. 由于缓存的数据可能会存在异步同时读写,所以做了一个后台同步队列,所有的缓存数据库操作都在这个队列

浅谈DOM的操作以及性能优化问题-重绘重排

写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳"过桥费",访问DOM的次数越多,费用也就越高.因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上.我们不可能不用DOM的接口,那么,怎样才能提高程序的效率? 既然

asp.net小谈网站性能优化

当然,网站性能优化是多方面的,这里先谈一下这些天来的所获: 1.书写代码的习惯: 再复杂的逻辑,也是从最简单的开始.在书写代码的过程中,很多不好的规范都会影响网站的性能: 以下是整理出来的些许代码习惯: 1)字符串的比较 用 string.Empty 代替 " " 2)在遍历过程中,先定义好计数变量, 再遍历, 这样会减少每次遍历就分配一次内存空间: 复制代码 代码如下: int i; for( i=0; i<100;i++) { // codeing } 3)同样的,用 Str

ASP.NET性能优化小结(ASP.NET&amp;C#)

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

Python 性能优化技巧总结

1.使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile.cProfile.hotshot等,memory_profiler用了psutil,所以不能跟踪cpython的扩展: 2.用C来解决费时的处理,c是效率的代名词,也是python用来解决效率问题的主要途径,甚至有时候我都觉得python是c的完美搭档.常用的是Cython,直接把py代码c化然后又能像使用py包一样使用,其次是ctypes,效率最最高的存在,最后还有CPython

MySQL性能优化的一些技巧帮助你的数据库

你完成了你的品牌新的应用程序,一切工作就像一个魅力.用户来使用你的网络.每个人是幸福的. 然后,突然间,一个大爆发的用户杀死你的MySQL服务器,您的网站已关闭.出了什么问题?你怎么能阻止它吗? 以下是MySQL性能优化的一些技巧,将帮助你,帮助你的数据库. 大处着眼 在早期的发展阶段,你应该知道预期到您的应用程序的用户数.如果你希望很多用户来说,你应该想想大,从一开始,计划进行复制,可扩展性和性能. 但是,如果你优化你的SQL代码,架构和索引策略,也许你不会需要大环境.你必须总是三思而后行的性

如何对 MongoDB 进行性能优化(五个简单步骤)

MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracle.MySQL 和 Microsoft SQL Server,此文中总结了如何对 MongoDB 进行性能调优. 大家在使用MongoDB的时候有没有碰到过性能问题呢?这里总结了MongoDB性能优化的五个步骤,希望能够有所帮助. 第一步:找出慢语句 一般来说查询语句太慢和性能问题瓶颈有着直接的关系

SQL Server数据库性能优化技术第1/2页

设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事.在开发工具.数据库设计.应  用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本文以SQL  Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议. 1 数据库设计  要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案.在实际工作中,许多SQL  Server方案往往是由于数据库设计得不好导致性能很差.

Web性能优化系列 10个提升JavaScript性能的技巧

Nicholas Zakas是一位 JS 大师,Yahoo! 首页的前端主程.他是<高性能 Javascript>的作者,这本书值得每个程序员去阅读. 当谈到 JS 性能的时候,Zakas差不多就是你要找的,2010年六月他在Google Tech Talk发表了名为<Speed Up Your Javascript>的演讲. 但 Javascript 性能优化绝不是一种书面的技术,Nicholas 的技术演进列出了10条建议,帮助你写出高效的 JS 代码. 1. 定义局部变量 当