PHP-FPM 参数配置及优化
后知后觉 暂无评论

PHP 无处不在,是互联网上历史悠久,也是互联网上最广泛部署的语言。

在 Apache / NGINX + PHP-FPM 架构下应该如何优化参数,达到最佳性能。

实际上当浏览器给服务器发送请求后,会将请求类型和头信息传输给服务器,然后 Apache 和 NGINX 会根据请求的类型将动态请求转发至后端 FPM(FastCGI) 接口。

工作模式

apache-fpm

上图是标准的 Apache 使用 PHP 工作示意图,PHP 作为一个模块和阿帕奇协同工作,这样导致一个问题,每次请求会调用一次模块,这个过程虽然很快,但是仍然存在延迟。

并且因为协议的实现问题,这种工作模式暂时不支持 HTTP/2 协议,所以现在 PHP-FPM 的模式为首选模式,而 Apache 和 NGX 都支持 FPM 模式,实际上只要是使用了 PHP-FPM ,那么 Apache 和 NGX 工作架构是没有区别的。

nginx-fpm

配置参数

在 FPM 模式中,使用的配置文件为 www.conf ,进程有两种类型:master(控制进程)、worker(工作进程)。

fpm-process-manager

pool

[www]

配置文件以 [www] 为始,这是一个“池”的名称,也就是 pool 名,配置文件中可创建多个池用于提供服务。

user

user = www-data
group = www-data

运行 worker 进程的用户与用户组,如果没有设置用户组,则会使用默认用户的属组。

listen

listen = 127.0.0.1:9000

接受 FastCGI 请求的地址,本参数接受两种方式:

连接方式网络通信缺点
TCP Socket因走网络栈,会占用网卡,且性能较差
Unix Socket高并发情况下不稳定,但受限于文件句柄限制
小贴士:因 Unix Socket 接口实质上为文件,因此推荐将其生成在 /dev/shm/ 目录中(此目录为内存映射目录,文件实质会存在高速内存中),修改 PHP-FPM 的配置文件即可,注意每个请求都会请求此文件,因此该方式受限于系统文件句柄数限制。

在高并发情况下,Unix Socket 方式下会频繁报错。

connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream

解决方式有两种:

监听地址的附加属性

manager

pm = dynamic

本参数有三个可选项:

pm.max_requests = 500

本参数为单进程 worker 接受的请求数限制,超过此数量后,此 worker 进程会被 PM(process manager) 进程自动重启。在解决第三方库的内存泄漏问题时,这个参数会很有用。默认值为 500,如果设置为 0,则指子进程可以持续不断的服务请求。


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。