一、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 高并发优化

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

  1. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP)

    LNMP环境和软件版本: 名称 版本号 查询命令 Linux系统 CentOS Linux release 8.1.1911 (Core) cat /etc/redhat-release Nginx ...

  2. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之MySQL配置

    mysql高并发配置 要在mysqld下设置 1. 修改back_log参数值:由默认的50修改为500.(每个连接256kb,占用:125M) back_log=500 back_log值指出MyS ...

  3. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之Nginx配置

    搭建好LNMP环境之后,接着要考虑的就是整个系统的并发能力了. 一.Nginx的配置 Nginx有很好的并发能力.但是要想使它的并发能力能够施展出来,需要在初步安装好的Nginx上做一些配置.主要需要 ...

  4. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之调试工具ab(apache bench)

    ab 测试工具,全称是 apache bench ,是 Apache 提供的一款测试工具,具有简单易上手的特点,在测试 Web 服务时非常实用. ab 可以在 Windows 系统中使用,也可以在 L ...

  5. 阿里云CentOS 7.4 64位,jdk1.6、mysql5.7、tomcat6部署步骤(个人记录)

    jdk1.6.mysql5.7.tomcat6部署步骤 一.安装jdk1.6 查看当前系统jdk的版本:java -version 方法一:利用yum源来安装jdk(此方法不需要配置环境变量) 查看y ...

  6. 阿里云Centos 6.3 64位 安全加固版 升级 Php 中的 Curl 7.19 到 7.35

    *注意是使用阿里云一键安装包的升级,升级前快照备份哟,小伙伴! 1.SSH远程到root下下载新版本curl 网址地址:http://curl.haxx.se/download.html 完成curl ...

  7. 【linux基础】如何查看Linux系统是64位还是32位

    如何查看Linux系统是64位还是32位 $getconf LONG_BIT or $file /bin/ls or #查看linux版本 $lsb_release -a or $uname -a 参 ...

  8. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  9. Linux:32/64位程序(应用程序、共享库、内核模块)

    摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...

随机推荐

  1. Java实现蓝桥杯分金币

    分金币 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币, 最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. 比如,n=4,且4个人 ...

  2. Java实现N的N次幂

    如果x的x次幂结果为10(参见[图1.png]),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字. 请把x的值计算到小数后6位(四舍五入),并填写这个小数值. 注意:只填写一个小数, ...

  3. java实现扑克牌排列

    ** 扑克牌排列** 下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程. 操作过程是: 手里拿着这套扑克牌,从前面拿一张放在后面,再从前面拿一张放桌子上,再从前面拿一张放在后面,- 如此 ...

  4. java实现第四届蓝桥杯幸运数

    幸运数 题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始 ...

  5. opencv 移植

    1.ubunut系统搭建opencv+python开发环境 1.1.ubuntu系统安装pip3工具 sudo apt-get install python3-pip //安装python模块安装工具 ...

  6. Redis PHP扩展安装步骤

    ### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...

  7. (二)MySQL8.0(ZIP)、SQLyog安装

    一.mysql8.0(ZIP)的安装 安装时看了很多的文章,开始选择的是客户端安装后一直安装失败,就选择了zip安装. 注意:该方法仅适用于8.0版本安装,其余版本未测试 1.下载zip压缩包(两个都 ...

  8. 【原创】Linux中断子系统(三)-softirq和tasklet

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. LR字符串处理函数-lr_save_var

    int lr_save_var ("截取的字符串"+start,len,options,param_name) start:表示从第几位截取  len:表示截取长度  option ...

  10. VS Code WebApi系列——3、发布

    上两篇已经实现了WebApi及基于jwt的Token设置,那么功能做完了,该发布WebApi了.为什么要对发布进行一下说明呢,因为是基于vscode和.netcore的发布,所以可能会遇到莫名奇妙的问 ...