PHP 无处不在,是互联网上历史悠久,也是互联网上最广泛部署的语言。
在 Apache / NGINX + PHP-FPM 架构下应该如何优化参数,达到最佳性能。
实际上当浏览器给服务器发送请求后,会将请求类型和头信息传输给服务器,然后 Apache 和 NGINX 会根据请求的类型将动态请求转发至后端 FPM(FastCGI) 接口。
工作模式
上图是标准的 Apache 使用 PHP 工作示意图,PHP 作为一个模块和阿帕奇协同工作,这样导致一个问题,每次请求会调用一次模块,这个过程虽然很快,但是仍然存在延迟。
并且因为协议的实现问题,这种工作模式暂时不支持 HTTP/2 协议,所以现在 PHP-FPM 的模式为首选模式,而 Apache 和 NGX 都支持 FPM 模式,实际上只要是使用了 PHP-FPM ,那么 Apache 和 NGX 工作架构是没有区别的。
配置参数
在 FPM 模式中,使用的配置文件为 www.conf ,进程有两种类型:master(控制进程)、worker(工作进程)。
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,则指子进程可以持续不断的服务请求。
附录
参考链接
- Optimizing PHP-FPM for High Performance - GeekFlare
- An Introduction to PHP-FPM Tuning - tideways
- PHP-FPM 进程数管理 - cnblogs.com
- PHP-FPM 子进程数量设置 - CSDN
- recv() failed (104: Connection reset by peer) while reading response header from upstream - cnblogs.com
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2024-01-05 17:01 PM