对线面试官:php-fpm优化总结

欢迎关注公众号

Nginx与php-fpm运行流程

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

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优化总结
两种方式的通信传输具体看这两篇文章:
TCP协议发送/接收数据实现
UDP协议发送/接收数据实现

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查看定时任务列表
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 1年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

hang死是什么意思

1年前 评论
Taoqun 1年前

这边有个比较明显的错误,master 不负责监听端口,worker进程都是抢占式accept,博主可以把master kill掉 观察工作状态!

1年前 评论
Mandy的名字被占用了_ 1年前
no_sign 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!