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优化经验的资料请关注我们其它相关文章!

(0)

相关推荐

  • 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 -

  • 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

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

  • 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

  • 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 处理完请求,

  • 巧妙解决Oracle NClob读写问题(经验分享)

    最近一个新项目中,尝试在 Oracle 数据库中使用 NCLOB 来保存大的 xml 字符串. 在代码自动生成工具(通过 JDBC 驱动程序,读数据库表结构,自动生成对应的 java 代码,包含增加.删除.修改.分页查询.根据主键查找等前台 html/js.后台代码 java),将 NCLOB 字段映射到 String 类型. 运行代码,无报错.使用 SQuirreL SQL 客户端查看数据,觉察数据未保存成功. 网上搜一通,有提到用 SetBigStringTryClob  的数据库连接额外属

  • 使用bootstrap validator的remote验证代码经验分享(推荐)

    这里需要说一下,bootstrapvalidator的帮助文档写的比较简单,对于remote验证器的说明更是如此,在经历多方测试之后才明白如何使用这个验证器. 一个典型的ajax验证代码如下: 服务端验证代码(使用spring mvc)如下: /* * 返回String类型的结果 * 检查用户名的合法性,如果用户已经存在,返回false,否则返回true(返回json数据,格式为{"valid",true}) */ @RequestMapping(value = "/chec

  • 手动挡汽车如何开省油的经验分享

    怎样开车最省油 一.新车磨合 新车在最初的3000公里行驶里程之内一定要磨合.新车磨合要注意时速控制在每小时80公里以内:尽量减少急加速.急减速. 二.合理保养汽车--定期保养 要知道车况良好的汽车可省油15%到20%. 1.空气滤清器.汽油滤清器.机油滤清器:每行驶5000公里以上配件都需要更换,因为空滤堵塞会引起气量减少,导致汽油燃烧不充分,降低燃油效率,而汽油滤清器的阻塞也会使发动机工作异常. 2.机油:加机油需要适量,注意机油标尺所标示的刻度.机油太多将曲轴淹没,增大阻力:机油太少则无法

  • MYSQL跨服务器同步数据经验分享

    项目需要,自己找了些资料和亲手配置过后:得出的经验分享. (1)主服务器 修改配置文件/etc/my.cnf(my.ini) [mysqld] # mysql-bin是log文件的前缀,也可以使用其它的名字,比如服务器名 # 如果不带路径,会把log文件写到`/var/lib/mysql`下 log-bin=mysql-bin # serverid在一个同步体系中必须是唯一的,大于等于1且小于2^32-1的整数 server-id=1 binlog-do-db = 数据库名 (你要备份的数据库)

  • Java异常区分和处理的一些经验分享

    异常处理的一些经验总结 这篇文章主要是对Java异常选择和使用中的一些误区的总结和归纳,希望各位读者能够熟练掌握异常处理的一些注意点和原则.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验,提高产品的价值.废话少说,直接看: 误区一.异常的选择 这张图描述了异常的结构,其实我们都知道异常分检测异常和非检测异常,但是在实际中又混淆了这两种异常的应用.由于非检测异常使用方便,很多开发人员就认为检测异常没什么用处.其实异常的应用情景可以概括为以下: 1.调用代码不能继续执行

  • 基于JavaScript 性能优化技巧心得(分享)

    JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中.为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择. 本文从加载.上下文.解析.编译.执行和捆绑等多个方面来讲解 JavaScript 的性能优化技巧,以便让更多的前端开发人员掌握这方面知识. 什么是高性能的 JavaScript 代码? 尽管目前没有高性能代码的绝对定义,但却存在一个以用户为中心的性能模型,可以用作参考:RAIL模型. 响应 如果你的应用程序能在1

  • Jar包一键重启的Shell脚本及新服务器部署的一些经验分享

    前言 最近公司为客户重新部署了一套新环境,由我来完成了基础环境的配置,配置过程中总结了一些经验,分享给各位园友 使用 curl 命令检查网络 拿到新服务器后,首先检查服务器网络是否通畅.我们常用的 ping 命令使用的是 ICMP 协议,大部分服务器都设置了域名出入站规则,即使某些地址可以 ping 通,也存在服务器无法访问的情况.这时可以使用 curl host:port 命令来测试该服务器能否正常发送 http 请求到外部服务器 安装 JDK 新服务器一般没有 JDK ,可以使用 java

  • pycharm第三方库安装失败的问题及解决经验分享

    一.报错信息:[file][Default Settint]---Project Interpreter 点击搜索suds安装模块报错 解决:依据上图提示找到C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\packaging_tool.py 文件的192行和109行 将do_install函数和do_uninstall函数修改为如下格式 def do_install(pkgs): try: try: from pip._internal i

  • MySQL从库维护经验分享

    前言: MySQL 主从架构应该是最常用的一组架构了.从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用.其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维护经验,一起来学习吧. 1.主从复制建议采用 GTID 模式 GTID 即全局事务 ID(Global Transaction ID),GTID 实际上是由 server_uuid:transaction_id 组成的.其中 server_uuid 是一个 MySQL 实例的唯一标识, transa

随机推荐