文档章节

NGINX + PHP-FPM 502

mickelfeng
 mickelfeng
发布于 2012/12/30 15:58
字数 1153
阅读 315
收藏 4

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

NGINX + PHP-FPM 报 502 错误,我想大部分 SA 都遇到过吧。
根据报错的频率,可以分为两种情况,间歇性的502和连续性的502。
这里只讨论第一种情况——间歇性的502。

502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的。

在 PHP-FPM 的配置中存在这么一项:

How much requests each process should execute before respawn.
Useful to work around memory leaks in 3rd party libraries.
For endless request processing please specify 0
Equivalent to PHP_FCGI_MAX_REQUESTS
<value name=”max_requests”>500</value>

这段配置的意思是,当一个 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)。大家要根据自己的实际情况设置这个值,不能盲目地加大。

1 首先查看一下目前php-fpm的进程数量

ps aux |grep php-fpm |grep -v grep |grep "^www"|wc -l

将输出结果与nginx.conf配置文件中的max_children参数做对比

如果两个值相近,那么就需要将max_children相应的增加

2 看一下nginx.conf配置文件中Nginx的等待时间的设置,可以相应增加

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

后来我将网站上一个shell脚本做了相应的修改:

主要是检测php-fpm进程的

脚本原则:
在检测到502报错之后,在干掉php-fpm进程之前先弄清楚一些东西:
统计子进程的数量是为了,判断一下是不是因为子进程的数量接近配置文件中max_children这个值的设置
如果这两个值很接近的话,说明排队的php请求比较多,处理请求过于繁忙也会导致502报错
统计CPU使用率最大的php-fpm进程所占用的CPU%,并记录相应的进程号,可以追踪进程号,做初步确定是否是 file_get_contents() 导致的问题
总之这些操作是有助于分析事发原因的
另外,如果killall进程之后不检测是否将进程杀干净,有可能会影响进程的重新启动,所以有必要进行这一步判断
如果运行该脚本的机器是在线服务器,那么当检测到进程没有杀干净时,最好报警或者是记录日志,尽量避免一直杀进程的操作


脚本内容:

#!/bin/bash
funCheck()
{
if [ -z "`ps aux |grep php-fpm |grep -v grep`" ];then
       if [ -z "`cat /usr/local/php/php-fpm.pid `" ];then 
       echo "php-fpm process doesn't exist ,you can start it now `date`" >> $Log
  else
    echo "php-fpm process  exists still  `date`" >> $Log  
  fi
fi
}


Log=/home/sysadmin/zhaoyj/log/PhpFpm.log
ChildProcess=`ps aux |grep php-fpm |grep -v grep |grep "^www"|wc -l`
DATE=`date "+%Y%m%d-%H:%M:%S"`
Message="MG Server php-fpm child process number is $ChildProcess at $DATE"
Admin="邮件地址"
if [ -e /var/lock/subsys/502 ]
then
 if [ $ChildProcess -ge 100 ];then 
   echo "$Message" |mail -s "$Message" $Admin
   echo "$Message" >> $Log
 fi

Record=``ps aux |grep php-fpm|grep -v grep |awk '{print $3"\t"$2"\t"$11}'|tr -d :|sort -nr|head -1`
CPU=`awk '{print $1}' $Record`
PID=`awk '{print $2}' $Record`
Result=`awk -v NUM1=$CPU -v NUM2=50 'BEGIN{print(NUM1>NUM2)?"1":"0"}'`
Message2="php-fpm child process CPU% is $Result"
   if [ $Result -eq 0 ];then
      echo "$Message2 ,normal now $DATE" >> $Log
    else
       echo "$Message2 ,not normal now $DATE" >> $Log
       echo "$Message2 ,not normal now $DATE" |mail -s "$Message2 ,not normal now $DATE" $Admin
   fi
 killall -9 curl 2>/dev/null
 killall -9 php-fpm 2>/dev/null
 funCheck
 service php-fpm start >/dev/null
 echo "[ `date +'%h %d %T'` ] PHP-FPM died with no response, all processes restarted">>/usr/local/php/log/php-fpm-restart.log
else
    touch /var/lock/subsys/502
    if [ `curl --connect-timeout 5 -I URL 2>/dev/null | grep '502 Bad Gateway' -c` != '0' ]
    then
        killall -9 php-fpm 2>/dev/null
  funCheck
        service php-fpm start >/dev/null
        echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/usr/local/php/log/php-fpm-restart.log
    fi
    rm -f /var/lock/subsys/502
fi

本文转载自网络

mickelfeng

mickelfeng

粉丝 238
博文 2811
码字总数 607897
作品 0
成都
高级程序员
私信 提问
加载中

评论(0)

Nginx防盗链 Nginx访问控制 Nginx解析php相关配置 Nginx代理

12.13 Nginx防盗链 cd /usr/local/nginx/conf/vhost vi test.com.conf 将以上内容复制到下图位置 测试,成功 前提data/wwwroot/test.com目录下要有1.gif 12.14 Nginx访问控制 cd /usr/local/...

cwliang
2018/03/15
0
0
http 502 和 504 的区别

文章转载自:http 502 和 504 的区 首先看一下概念: 502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 503:由于临时的服务器维护或者过载,服务器当前无...

老K8
02/14
0
0
nginx+php-fpm结构模型剖析及优化(转载)

一、nginx和php-fpm的关系和分工 nginx是web服务器,php-fpm是一个PHPFastCGI进程管理器,两者遵循fastcgi的协议进行通信,nginx负责静态类似html文件的处理,php-fpm负责php脚本语言的执行,...

osc_57loaj8m
2018/12/20
2
0
[HTTP] http中的502 , 504 , 499 500都是啥

经常我们会遇到502错误 , 502错误究竟是啥呢 , 在字面意思是指bad gateway 网关错误 , 网关是啥 在我们的nginx + php-fpm中 , nginx相当于网关 ,但是这里的错误却是指的nginx的上游服务出错了...

陶士涵
03/23
0
0
PHP 出现 502 解决方案

nginx+php 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种。 1. php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大...

Leone-
02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二、netcore跨平台之 Linux部署nginx代理webapi

原文: 二、netcore跨平台之 Linux部署nginx代理webapi 上一章,我们讲了在linux上安装netcore环境,以及让netcore在linux上运行。 这一章我们开始讲在linux上配置nginx,以及让nginx反向代理...

osc_jo2m8l1r
24分钟前
10
0
CAD怎么转PDF文件?使用这款编辑器一键转换、批量转换

CAD怎么转换成PDF文件呢?小伙伴们不妨使用这款CAD编辑器,把CAD文件一键、批量转换成PDF文件哦。 有许多小伙伴应该都知道,为了满足各种学习、工作的需求,文件之间是经常需要相互转换格式的...

真不莲
24分钟前
19
0
详解Microsoft.AspNetCore.CookiePolicy

原文: 详解Microsoft.AspNetCore.CookiePolicy 详解Asp.Net Core中的Cookie策略 目录 详解Asp.Net Core中的Cookie策略 功能介绍 使用Cookie策略 从UseCookiePolicy方法入手 实现IResponseCo...

osc_0vd38ylb
25分钟前
16
0
怎么找到自己收藏过的思维导图模板?迅捷画图教你详细步骤!

怎么找到自己收藏过的思维导图模板?大家在刷视频的时候,遇到自己喜欢的视频,都会点个微信或者关注,用电脑看网页的时候,遇到有意思的网站,也会点击添加书签进行收藏,方便以后阅读或者是...

赛利亚大姐大
27分钟前
6
0
Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (一)

原文: Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (一) Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (一) 目录 Microsoft.AspNetCore.Authentication.Cook......

osc_t5nbj8ds
27分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部