概述

昨日项目基本完工,然后走测试服测试项目时,接口返回,连接异常关闭,排错发现,我的Mysql服务502了, 在这里插入图片描述

排错 Nginx & php-fpm

然后又继续排查Nginx日志, 发现Nginxphp-fpm通讯出现了问题

recv() failed (104: Connection reset by peer) while reading response header from upstream 在这里插入图片描述

出现这种错误,通常都是php-fpm没能正常响应Nginx 导致php-fpm这种情况,要么程序执行超时,要么就是服务器进程内存泄露, 程序上,我也是测了又测的,程序执行时间都在配置的php.ini,php-fpm.conf的超时时间内,不存在那么久的超时,

解决

修改php-fpm配置文件 在这里插入图片描述

我这里是直接用pm.max_requests = 500来处理 意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。

如果pm.max_requests没有设置重启参数,默认为0不限制最大服务次数,也就是子进程永远不重启,长时间不重启子进程会导致系统负载异常,处理时间变长等现象。

pm = dynamic
pm.max_children = 35
pm.start_servers = 8
pm.min_spare_servers = 6
pm.max_spare_servers = 35
pm.max_requests = 500

有时候由于 php-fpm 有好多闲置的进程一直不释放, 导致内存占用过大,FastCGI 进程一旦加载就不会释放,当其工作完成后,就休眠于 FastCGI 系统池中,等待下一次被唤醒。甚至是php-fpm假死,也会出现502的错误,只能重启php-fpm才能解决这个问题。

注:

  • Nginx报错upstream timed out (110: Connection timed out) 就是由于pm.max_requests 默认值为0,没有重启所引起的。
  • php-fpm子进程假死,就会经常出现502 Bad Gateway的错误
  • 打开.php的文件总是感觉很慢,Web请求时一直处于pending状态。