php-fpm常见错误及解决办法整理

1,request_terminate_timeout引起的资源问题
[v_tips]request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。[/v_tips]
如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时。我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。

request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免”502 Bad Gateway”。
解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给file_get_contents加一个超时参数。

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 10    //设置一个超时时间,单位为秒
    )
));
 
file_get_contents($str, 0, $ctx);

2,max_requests参数配置不当,可能会引起间歇性502错误:

pm.max_requests = 1000

设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。
但是为什么要重启进程呢?
一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。

正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。

目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实际情况设置这个值,不能盲目地加大。
[v_tips]话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。[/v_tips]
3,php-fpm的慢日志,debug及异常排查神器:
request_slowlog_timeout设置一个超时的参数,slowlog设置慢日志的存放位置

tail -f /var/log/www.slow.log

上面的命令即可看到执行过慢的php过程。
大家可以看到经常出现的网络读取超过、Mysql查询过慢的问题,根据提示信息再排查问题就有很明确的方向了。

主题测试文章,只做测试使用。发布者:云大使,转转请注明出处:https://www.xp8.net/server/289.html

赞 (0)
打赏 微信扫一扫 微信扫一扫
上一篇 2018年8月16日 上午11:34
阿里云服务器安装宝塔面板打不开
下一篇 2018年8月18日 下午9:12

相关推荐

  • linux教程-关于Docker 私有镜像库与阿里云对象存储 OSS教程-学派吧

    本篇文章给大家带来的内容是关于Docker 私有镜像库与阿里云对象存储 OSS,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Docker私有镜像库 Docker 私有镜像库与阿里云对象存储 OSS 镜像管理是 Docker 的核心,为了满足企业或组织内部分享镜像,Docker 官方在 Github上 建立了一个开源项目 docker-re…

    服务器运维 2018年11月24日
    3.4K00
  • 腾讯云快照功能:如何定时定点尽快快照备份

    在云计算时代,数据安全是每个企业和开发者最关心的问题。腾讯云提供的快照功能为云硬盘数据提供了强大的保护机制。本文将详细介绍如何配置定时定点的快照备份策略,确保您的数据安全无忧。 快照功能 快照是云硬盘在某一时刻的完整数据副本,采用增量存储技术,仅保存变化数据块,大幅降低存储成本。快照功能具有以下核心优势: 二、定期快照策略配置(云硬盘) 1. 控制台配置步骤…

    2026年6月29日
    47600
  • fastcgi分离和lamp虚拟主机部署wordpress和discuzx教程

    lamp架构wordpress和discuzx教程 背景 虚拟主机 fastcgi 部署流程 部署架构 环境 架构图 编译软件 安装开发环境和必要的包 编译httpd 编译php 安装mariadb 配置文件修改 修改httpd主机 修改fast-cgi主机 配置mysql 宿主机的hosts文件修改 安装wordpress和Discuzx 背景 虚拟主机 …

    2018年10月11日
    2.8K00
  • Nginx、FPM配置及优化教程说明-学派吧 linux运维

    Nginx配置 main模块 events 模块 http模块 sendfile keepalive 超时 map proxy openfile client buffer Gzip fastcgi cache server模块 正则 Rewrite 文件缓存 FPM HTTPS upstream模块 默认轮询(加权) 最小连接数 IP Hash FPM配置…

    服务器运维 2018年10月11日
    3.6K00
  • 关于Win2008R2服务器配置VPN服务器的图文教程方法-windows教程-学派吧

    这篇文章主要介绍了Win2008 r2服务器配置VPN服务器教程(图文详解),需要的朋友可以参考下 系统环境:WindowsServer2008R2Enterprise(完全安装) 1、配置准备工作1.1、点击“开始”右边的“服务器管理器”1.2、在“服务器管理器”里点击“角色”1.3、在“角色”上点击右键选译“添加角色”,点击“下一步”1.4、在“角色”里…

    服务器运维 2018年12月2日
    3.2K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

工作时间:周一至周五,9:30-18:30,节假日休息

添加微信
添加微信
分享本页
返回顶部