如果你使用的是Nginx-PHP架构,那么Nginx接到请求,接下来就是转发给PHP服务器进行处理了,而PHP服务器基本上现在都使用php-fpm。我们来看看php-fpm的配置中与连接数有关的配置如何优化。
PHP-FPM管理的方式是一个master主进程,多个pool进程池,多个worker子进程。其中每个进程池监听一个socket套接字。见下图:
在服务器负载有很大余量,业务场景请求量不大的情况下,可以考虑单台服务器开多个php-fpm进程池,每个进程池负责处理不同的业务。
来看一个php-fpm进程池的配置:
[global]
-
pm = dynamic,这个是配置如何控制子进程的,选项有static和dynamic,如果服务器配置低,比如内存只有512KB、1GB这种的,可以考虑设置成static,避免频繁的销毁和重建worker;如果配置还可以,就用dynamic
-
如果配置成static,则worker的数量就等于pm.max_children的配置
-
如果pm设置为dynamic,那么pm.max_children参数失效,系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
-
pm.max_requests是用来配置单个worker能处理的最大请求数,达到配置数量后,worker会重启
-
一般单个worker的内存占用可以按照30M一个来计算,也可以实际测试,注意单个进程经常存在内存泄露的情况,长时间运行,单个worker的内存占用会比刚启动时高,不过一般30M一个基本够了
-
假如服务器内存有8G,且该服务器只处理php-fpm服务,则内存和cpu负载在计算时都不要超过60%,即计算时,可以如下计算worker数,8GB * 60% / 30MB = 164个
-
配置请求超时时间request_slowlog_timeout,并配置慢日志slowlog = /var/log/aaa-slow.log