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

    • IPv4地址:端口:监听 IPv4 address
    • [IPv6地址]:端口:监听 IPv6 address
    • 端口:只写端口情况下会监听全部地址(IPv6 和 IPv4)
  • UNIX socket

    • /path/to/unix/socket 套接字地址
连接方式网络通信缺点
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

解决方式有两种:

  • 调高 backlog 数值

    listen.backlog = 511
  • 增加 Socket 文件数量,将大访问量域名拆出,或将请求负载均衡到多个 Socket 文件上,并增加 FPM 的实例数量。

监听地址的附加属性

  • 如果监听的是 UNIX socket 模式,需要指定用户和用户组,用于生成 socket 接口文件。

    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
  • 如果监听的是 TCP socket 模式,需要指定可访问的地址,通常用于跨主机通讯。

    listen.allowed_clients = 127.0.0.1

manager

pm = dynamic

本参数有三个可选项:

  • static(静态模式):在此模式下,worker 进程数量固定

    • pm.max_children(最大子进程数量):在此模式下仅有此参数生效
  • dynamic(动态模式):在此模式下,worker 进程数量动态调整。

    • pm.max_children(最大子进程数量):可以容纳最大的子进程数量
    • pm.start_servers(起始子进程数量):启动时就创建的子进程数量
    • pm.min_spare_servers(“空闲”状态最小数量):保证“空闲”状态的最小子进程数量
    • pm.max_spare_servers(“空闲”状态最大数量):保证“空闲”状态的最大子进程数量(如果超过就会杀死部分子进程)
    • pm.process_idle_timeout(子进程超时时间):子进程闲置超时时间后会被杀死
  • ondemand(即用模式):在此模式下,worker 进程启动时默认不创建,在产生新请求时会自动创建

    • pm.max_children(最大子进程数量):可以容纳最大的子进程数量
    • pm.process_idle_timeout(子进程超时时间):子进程闲置超时时间后会被杀死
pm.max_requests = 500

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


附录

参考链接

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