Nginx502状态码处理

  1. 问题描述
    最近偶然收到报警邮件,Nginx 502状态码
    环境是Nginx+php-fpm 配置 8核16G

    yds.png

  2. 分析处理:
    根据经验应该是php-fpm原因
    (1) php-fpm进程挂掉起不来
    (2) php-fpm的9000端口不通
    (3) 请求过多,php-fpm处理队列

登录后台服务器查看php-fpm进程和端口等

1. php-fpm 进程存在
# ps auxf | grep 'php-fpm: master' |grep -v grep
root     31590  0.0  0.0 316140  9348 ?        Ss   14:26   0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)

2. 9000端口是通的
# telnet 127.0.0.1 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

3. php-fpm 进程只有12个
# ps auxf | grep 'php-fpm' | wc -l
12

由上命令结果看出php-fpm进程较少,先增加php-fpm,配置文件php-fpm.conf
pm = dynamic
pm.max_children = 600
pm.start_servers = 300
pm.min_spare_servers = 300
pm.max_spare_servers = 500
pm.max_requests = 6000

修改后重启php-fpm,完美收工。

  1. 过一段时间后又偶然收到后台报警502。
    马上登录后台服务器查询进程和端口,都正常。
    开始查看日志。
    (1) 查看nginx访问日志502


    nginx-access.png

(2) 查看nginx error日志
查看到connect() failed (111: Connection refused) while connecting to upstream
应该是php-fpm问题


nginx-error.png

(3) 查看php-error.log日志
看到php-fpm每分钟都在重启
NOTICE: Finishing ...
NOTICE: exiting, bye-bye!


php-error.png

(4) 去查看计划任务。有个脚本每分钟执行一次。
内容是:
(1) 判断php-fpm进程是否存在,如不存在,则重新启动php-fpm;
(2) 判断剩余内存,如果剩余内存<1600M,则重新启动php-fpm;
(5) 临时停止这个脚本后,php-fpm未重启过。
(6) free -m 查看内存还剩200M,所以计划任务脚本会重启php-fpm;但是重启php-fpm后buffer/cache未释放。所以每分钟会重启php-fpm;

  1. 在脚本中添加手动释放内存,恢复正常;
php_restart (){
   mem=`free -m|grep Mem|awk '{print $4}'`
   if [ ${mem} -lt 1600 ];then
      echo "3" > /proc/sys/vm/drop_caches
      /etc/init.d/php-fpm restart
      echo `date` >> /tmp/phprestart.log
   fi
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。