首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nginx + php-fpm 性能调优

nginx + php-fpm 性能调优

作者头像
用户3147702
发布于 2022-06-27 04:33:30
发布于 2022-06-27 04:33:30
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

1. 概述

对于PHP服务而言,nginx + php-fpm 是常用的服务配置,如何进行服务器性能调优是一个服务端开发的必备技能。

2. nginx 与 PHP-FPM 的通信

nginx 是通过 fastcgi 与 php-fpm 通信的,他的连接是通过 socket 的方式实现的。 在安装 php-fpm 后,默认他监听了 localhost:9000 的 TCP 端口。 TCP 连接的通信效率要比 UNIX 域协议的通信效率低很多,因此,我们首先通过配置将 nginx 与 php-fpm 的通信改为 UNIX 域协议,可以实现优化。

2.1. nginx 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~ .*\.(php|php5)?$ {
    root           /var/www;
    fastcgi_pass   unix:/dev/shm/php-cgi.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /var/www$fastcgi_script_name;
    include        fastcgi_params;
}

2.2. php-fpm 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listen = /dev/shm/php-cgi.sock

顺次重启 php-fpm 和 nginx 就实现了通信。

也许你会发现访问返回了 502 bad gate way。 这是因为 unix 域协议文件没有权限访问,可以通过 chmod 改变 /dev/shm/php-cgi.sock 文件的权限解决。

3. nginx worker 数

通过 nginx 配置中的 worker_processes 可以指定 nginx 运行时的 worker 数量,默认在运行 ./configure 的时候会检测硬件将该配置设为 CPU 核心数。 理论上说,worker 越多,处理请求的能力越强,由于 worker_cpu_affinity 将 nginx 的 worker 与 CPU 核心绑定执行,这使得 worker 可以使用 CPU 缓存,避免了上下文切换带来的开销,因此,不要让 worker 数小于 CPU 核心数是最起码的要求,否则多个核心切换时会带来不必要的开销。 测试结果表明,nginx worker 数是 CPU 核心数的 2 倍时性能最优。

4. backlog 的设置

大量并发的场景中,常常会出现 nginx 返回: connect() to unix:/tmp/php-fpm.socket failed (11: Resource temporarily unavailable) while connecting to upstream。 这意味着 php-fpm 停止停止接收任务了。 避免这个问题,就要在 php-fpm 的配置上着手了。

首先,通过调整 nginx、php-fpm 和系统内核的 backlog,可以让 socket 通信积压更大,从而缓解这个压力。 如在 nginx server 块配置中加入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listen 80 default backlog=1024;

在 php-fpm 配置中加入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listen.backlog = 2048

并将 /etc/sysctl.conf 文件中相关配置改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 4096

5. 增加 PHP-FPM worker 数

关于 php-fpm 的 worker 数,有如下四个参数:

  • pm.max_children — 静态方式下开启的 php-fpm 进程数量
  • pm.start_servers — 动态方式下的起始 php-fpm 进程数量
  • pm.min_spare_servers — 动态方式下的最小 php-fpm 进程数量
  • pm.max_spare_servers — 动态方式下的最大 php-fpm 进程数量

通过制定 pm 参数为 static 或 dynamic,php-fpm 会应用上述对应的配置数。 通过将 php-fpm 的 worker 数设置增大,可以增加他的并发能力。 长期运行中,每个 php-fpm worker 占用内存约 30MB 左右,worker 数的具体大小需要根据系统的内存总量控制,否则可能造成系统被拖垮。

6. 定时重启 php-fpm

与 Apache 一样,php-fpm 也有内存泄露的问题,因此定时重启也可以增加系统的性能。 在 crontab 中写入定时的 php-fpm restart 或 reload 是一个很方便的措施。

7. 配置 php-fpm 关闭执行时间限制

通过 php-fpm 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
request_terminate_timeout = 0

去除 PHP 执行时间限制,不会在 PHP 执行过程中由于超时中止 PHP 的执行。 同时,需要对 PHP 的 max_execution_time 选项进行设置。

8. 配置 php-fpm 查看返回错误

通过 php-fpm 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catch_workers_output = yes

这个配置将运行中的 stdout 和 stderr 输出到主要的错误日志文件中。 如果没有设置这个选项,stdout 和 stderr 会被重定向到 /dev/null。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
php-fpm.conf中pm.max_children多大合适,报错you may need to increase pm.start_servers, or pm.min/max_spare_se
web使用的是nginx+php的架构,网站上线还没多久,所以优化方面基本只是做了些初始的配置。 查看php-fpm.log发现有警告,这些警告和网站的挂了个时间基本吻合。我就从这里开始入手。 先开始也是找了些文档,但是第二天还是出现问题。后来查看配置文件并翻译了下(百度),英文底子不好。pm模块类似apache的模块,是分静态和动态的。 网上说的很多调整都是基于动态居多,但是并没说么定义这个模块。所以大家用动态和静态还是要仔细看看配置文件
全栈程序员站长
2022/07/18
1.7K0
php-fpm.conf中pm.max_children多大合适,报错you may need to increase pm.start_servers, or pm.min/max_spare_se
PHP-FPM 性能配置优化
php-fpm 全称是 PHP FastCGI Process Manager 的简称,从名字可得知,是一个 FastCGI 的管理器。
南山竹
2024/06/12
3710
PHP-FPM 性能配置优化
详解 Nginx 和 php-fpm 调用方式
PHP 项目使用 Nginx 时,一般通过 php-fpm Nginx+PHP-FPM 形式访问交互,本文将详细解读 Nginx 配置文件、PHP-FPM、PHP-CGI 和 fastCGI 的概念。
Yangsh888
2022/03/28
2.8K0
nginx和php-fpm通信,使用unix socket还是TCP及其配置
nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式。两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。
lukachen
2023/10/22
1.8K0
PHP-FPM+Nginx通信原理图文剖析
PHP-FPM的全称是PHP FastCGI Process Manager,PHP-FPM是FastCGI的实现,并提供了进程管理的功能。FastCGI进程包含master进程和worker进程两种进程。master进程只有一个,负责监听端口,接收Nginx的请求,而worker进程则一般有多个(可配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
Tinywan
2023/11/17
7200
PHP-FPM+Nginx通信原理图文剖析
php-fpm报502问题「建议收藏」
搭建lnmp完lnmp环境后,测试时出现502报错,看到这个问题,我立刻想到是php-fpm没有起来,但是我用 ps -ef | grep php-fpm 截取 php-fpm 的进程,发现是有的,这时我有查看nginx的错误日志,发现错误信息是:
全栈程序员站长
2022/07/18
5170
php-fpm报502问题「建议收藏」
一条502报警引发的胡思乱想
就在安心养神的时候, 同事转给了我一条nginx 502的报警, 赶紧去线上一顿排查。
用户2825413
2019/07/16
7080
一条502报警引发的胡思乱想
PHP-FPM
PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
友儿
2022/09/11
1K0
PHP-FPM多方面调优策略
FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。比方说: 支持平滑停止/启动的高级进程管理功能、文件上传优化支持、stdout 和 stderr 日志记录等等,更多请移步官网 https://www.php.net/manual/zh/install.fpm.php
憧憬博客
2020/07/21
9210
工具系列 | PHP-FPM+Nginx 通信详解
PHP-FPM的全称是PHP FastCGI Process Manager,PHP-FPM是FastCGI的实现,并提供了进程管理的功能。FastCGI进程包含master进程和worker进程两种进程。master进程只有一个,负责监听端口,接收Nginx的请求,而worker进程则一般有多个(可配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
Tinywan
2023/03/08
3.5K0
工具系列 | PHP-FPM+Nginx 通信详解
linux学习第四十八篇:php-fpm的pool,php-fpm慢执行日志,定义open_basedir,php-fpm进程管理
php-fpm的pool Nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。 vim /usr/local/php/etc/php-fpm.conf 在[global]部分增加: include = etc/php-fpm.d/*.conf 创建php-fpm.d目录: mkdir /usr/local/php/etc/php-fpm.d 进入目录: cd /usr/local/php/etc/php-fp
用户1215343
2018/02/05
7770
linux学习第四十八篇:php-fpm的pool,php-fpm慢执行日志,定义open_basedir,php-fpm进程管理
LNMP出现502 bad gateway的解决
问题:最近的抢购有点火,到点抢购的时候网站就会出现502 bad gateway错误 顶不住消费者的压力。
星哥玩云
2022/07/03
5520
LNMP出现502 bad gateway的解决
php-fpm.conf配置说明及demo
阿湫..
2023/06/21
5660
PHP进程管理器php-fpm配置说明
php-fpm是PHP的一个进程管理器。php下面的众多work进程皆由php-fpm进程管理器管理。具体可参考:http://www.qqdeveloper.com/2019/10/06/CGI-FastCGI-php-fpm/
兔云小新LM
2020/05/27
2.4K0
LNMP架构介绍、安装PHP(php-fpm)
CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。
阿dai学长
2019/04/03
2.1K0
Php-fpm相关配置
一、php-fpm的pool: 有时候我们一个服务器可能会跑多个WEB,多个web就要对应多个pool,如果多个WEB SERVER对于一个php-fpm中的sock,一旦一台出现问题(资源耗尽502等)其它的server也会同样出现502! 1.1 配置文件详解: [root@zhdy-03 ~]# vim /usr/local/php-fpm/etc/php-fpm.conf 我们之前就配置了一个默认的www [www] listen = /tmp/php-fcgi.sock #listen = 127
老七Linux
2018/05/09
1.2K0
PHP7中php.ini、php-fpm和www.conf 配置
php.ini是php运行核心配置文件,下面是一些常用配置 extension_dir="" 设置PHP的扩展库路径 expose_php = Off 避免PHP信息暴露在http头中 display_errors = Off 避免暴露php调用mysql的错误信息 log_errors = On 在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置) zend_extension=opcache.so extension=mysqli.so
conanma
2021/12/02
1.7K0
了解PHP-FPM
在服务器上,当我们查看php进程时,全都是php-fpm进程,大家都知道这个就是php的运行环境,那么,它到底是个什么东西呢?
硬核项目经理
2019/11/19
1.6K0
【高级】PHP-FPM和Nginx的通信机制
每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件。
全栈程序员站长
2022/07/08
5090
【高级】PHP-FPM和Nginx的通信机制
php-fpm – 配置详解
pid = run/php-fpm.pid pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
Java架构师必看
2021/03/22
1.7K0
相关推荐
php-fpm.conf中pm.max_children多大合适,报错you may need to increase pm.start_servers, or pm.min/max_spare_se
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档