阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之php-fpm配置及其与Nginx的通信

时间:2022-01-29 07:01:39

一、php-fpm的配置

1、 php-fpm的配置,首先要关注进程数量。

php-fpm的进程管理方式有三种:static、dynamic、ondemand。

static方式,开启固定数量(pm.max_children)的子进程;

dynamic方式,子进程的数量是根据以下指令动态设置的。而且这种管理方式,会始终保持至少有1个子进程。

(1)pm.max_children-可以同时存活的最大子进程数。

(2)pm.start_servers-启动时创建的子进程数。

(3)pm.min_spare_servers-处于“空闲”状态(等待处理)的最小子进程数。如果“空闲”进程的数量少于该数量,则将创建一些子进程。

(4)pm.max_spare_servers-处于“空闲”状态(等待处理)的最大子进程数。如果“空闲”进程的数量大于该数量,那么一些子进程将被杀死。

ondemand方式, 启动时不会创建任何子进程。当有新的请求连接时,子进程才会被派生。这种方式以下参数会被使用:

(1)pm.max_children-可以同时存活的最大子进程数。

(2)pm.process_idle_timeout-空闲进程将被杀死的秒数。

一般默认的是动态管理方式,即dynamic方式。如果服务器内存充足,可以考虑用静态管理方式,即static方式,这样可省去php-fpm自动创建进程的时间。

在这些相关的参数中,pm.max_children 是比较关键的一个参数,如果值不够用会报错 recv() failed (104: Connection reset by peer) while reading response header from upstream ,其大小的确定可以参考 服务器内存/2/30 这个公式来确定。其中的30,即一个php进程所占用内存的大小,一般一个进程占 20M到30M的内存。

2、最大请求数max_requests

最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。

这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。

pm.max_requests = 10240

  • 当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程。
  • 502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的.
  • 如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长(比如第三方库有问题等)。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。
  • 正是因为这个机制,在高并发中,经常导致 502 错误
  • 目前我们解决方案是把这个值尽量设置大些,减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。PS:刚开始我们是500导致内存飙高,现在改成5120,当然可以再大一些,10240等,这个主要看测试结果,如果没有内存泄漏等问题,可以再大一些。

3、最长执行时间request_terminate_timeout

设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ‘0’ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。

当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。

Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。

  • 如果发生 file_get_contents() 获取网页内容较慢的情况,会报502错误。所以使用file_get_contents()时,要加一个超时时间。

(关于502、504错误总结可以参考这篇文章 https://www.kancloud.cn/digest/php-src/136260

二、php-fpm和Nginx的通信

1、在 linux 中,nginx 服务器和 php-fpm 可以通过 tcp socket 和 unix socket 两种方式实现。

tcp socket

允许通过网络进程之间的通信,也可以通过loopback进行本地进程之间通信。

unix socket

允许在本地运行的进程之间进行通信。

2、Unix域Socket因为不走网络,的确可以提高Nginx和php-fpm通信的性能,但在高并发时会不稳定。

Nginx会频繁报错:connect() to unix:/run/php-fpm/www.sock failed (11: Resource temporarily unavailable) while connecting to upstream

所以,在高并发是可以选择用 tcp socket 的方式通信,但是可以调高nginx和php-fpm中的backlog来提高稳定性。

配置方法为:在nginx配置文件中这个域名的server下,在listen 80后面添加default backlog=1024。

同时配置php-fpm.conf中的listen.backlog为1024。

backlog值的大小应该和并发数大小一致。

下一篇随笔总结一下MySQL高并发的配置

本文参考的主要文章:

php-fpm 与 Nginx优化总结

nginx php-fpm 高并发优化