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

php-fpm优化总结经验分享的更多相关文章

  1. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  2. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  3. Swift思量与初探:我需要学习Swift吗?

    最近,除了N多的基于Swift的服务端开发框架,笔者不由深思,到底该这么评价Swift呢?前两点在Swift的语法和语言特性中已经表现得淋漓尽致:像是尾随闭包,枚举关联值,可选值和强制的类型安全等都是Swift显而易见的优点。综上所述,Swift拥有着被广泛使用以及当做第一学习语言的潜质。Swift在语法层次上会更加高级,并且Swift并没有使用GC机制,因此可以与C更好地相兼容。Swift中的注释与C语言的注释非常相似。

  4. 尝试使用swift mailer,gmail smtp,php发送邮件

    这里是我的代码:在运行时出现此错误…

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. jQuery的Cookie封装,与PHP交互的简单实现

    下面小编就为大家带来一篇jQuery的Cookie封装,与PHP交互的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  8. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  9. PHP rsa加密解密算法原理解析

    这篇文章主要介绍了PHP rsa加密解密算法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  10. PHP cookie与session会话基本用法实例分析

    这篇文章主要介绍了PHP cookie与session会话基本用法,结合实例形式分析了PHP cookie与session会话基本存储、设置、删除等相关使用方式,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部