phpfpm配置的核心就一句话:根据服务器可用内存和并发峰值,先算好pm.max_children,再配合慢日志、通信方式和pm.max_requests,多数卡顿、内存溢出和502都能解决。
phpfpm配置怎么优化:先锁死这4个核心参数
很多人改phpfpm配置像无头苍蝇,其实phpfpm配置怎么优化,优先级很明确,先看这几个参数:
pm.max_children:进程池最大子进程数,决定PHP能同时处理多少请求,也直接决定内存占用上限。pm.start_servers:启动时创建的子进程数,只在pm = dynamic时生效。pm.min_spare_servers/pm.max_spare_servers:空闲进程保留区间,太小会导致请求来了临时fork,太大浪费内存。pm.max_requests:每个子进程处理多少请求后重启,专门解决内存泄漏问题。
行业共识认为,这四个参数是phpfpm配置的骨架,先调它们,再谈其他。
pm.max_children怎么算:拿内存反推最稳
不要拍脑袋,打开服务器执行:
free -m
看Available列,假设可用内存2G,每个PHP-FPM子进程通常占用30-80MB,具体取决于加载扩展和业务代码,保守按50MB算。
max_children ≈ 可用内存 / 单进程内存
2G可用内存除以50MB约等于40,留一点余量给MySQL和系统,设30-35比较安全,别贪多。
公式写出来就是:pm.max_children = 可用内存(MB) / 单个php-fpm进程平均内存(MB),实际再打个7折。
start_servers和spare_servers怎么配合
这三个参数只在pm = dynamic时有用,按场景理解:
- 低流量站点:
start_servers设小一点,比如2-4个,省内存。 - 流量波动大:
min_spare_servers设低、max_spare_servers设高,让进程数弹性伸缩。 - 高并发稳定流量:
start_servers
直接设为
max_children的一半,减少冷启动开销。
修改示例:
pm = dynamic
pm.max_children = 30
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
改完重启:
systemctl restart php-fpm
php-fpm与nginx通信配置:listen参数选tcp还是socket
这是另一个高频疑问,php-fpm与nginx通信配置里,listen有两种写法:
listen = 127.0.0.1:9000(TCP)listen = /var/run/php-fpm.sock(Unix Socket)
多数情况下,Unix Socket比TCP稍快,因为少了网络栈开销,适合单机Nginx+PHP场景,多台服务器分离部署时,必须用TCP。
tcp与unix socket对比
| 维度 | TCP 127.0.0.1:9000 | Unix Socket |
|---|---|---|
| 性能 | 略低 | 略高 |
| 跨服务器 | 支持 | 不支持 |
| 权限控制 | 防火墙/端口 | 文件权限 |
| 排障难度 | 较低 | 需要看sock文件owner |
宝塔面板默认通常用Unix Socket,所以注意Nginx配置里的fastcgi_pass要和PHP-FPM的listen保持一致。
通信配置实操路径
- 编辑php-fpm配置文件,找到
listen行,改成想要的地址或sock路径。 - 编辑Nginx站点配置,找到
fastcgi_pass,改成对应的地址或sock路径。 - 检查sock文件权限:
ls -l /var/run/php-fpm.sock,确保Nginx用户有读写权限。 - 重启php-fpm和Nginx。
phpfpm进程数设置多少合适:从1核1G到8核16G的场景
phpfpm进程数设置多少合适,没有统一数字,但可以按服务器配置给参考范围。
低配服务器(1核1G或2G内存)
这类机器内存紧张,可用内存往往只有700MB-1.5G,PHP单进程占用30-50MB,

pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
设多了会频繁OOM,系统直接卡死。
中配服务器(4核8G)
可用内存大约6G,单进程按50MB算,理论上能开120个,但实际留一些给其他服务:
pm.max_children = 80
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 60
高配服务器(8核16G以上)
可以用静态模式pm = static固定进程数,减少动态管理开销:
pm = static
pm.max_children = 150
业内专家指出,静态模式在CPU充足时能避免进程频繁创建销毁带来的延迟抖动。
phpfpm慢日志配置与内存占用高排查
开启slowlog:让慢查询自己报上来
phpfpm慢日志配置非常容易,改两个参数:
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s
这表示超过5秒的PHP请求会被记录,日志里能看到具体函数调用栈,定位卡点很快。
配置文件常见路径:/etc/php-fpm.d/www.conf或/usr/local/php/etc/php-fpm.conf,宝塔用户直接在面板“软件商店”对应PHP版本右侧“设置”里改,不用敲命令。
phpfpm内存占用高怎么解决:max_requests是关键
如果发现php-fpm进程内存越跑越高,通常不是配置错误,而是业务代码有内存泄漏,解决办法不是无限加大内存,而是让进程定期自杀重启:
pm.max_requests = 500
表示每个子进程处理500个请求后自动退出,重新fork一个干净进程,这个值设太小会增加重启开销,设太大则泄漏积累,多数情况下300-1000之间比较合理。
也可以用这条命令观察内存:
ps --no-headers -o rss -C php-fpm | awk '{sum+=$1} END {print sum/1024 " MB"}'
如果单个进程RSS超过100MB,先检查代码里的循环引用、静态变量、长连接,再配合调低

max_requests。
宝塔phpfpm配置和简米云场景的注意点
宝塔phpfpm配置入口不算深,但新人常找错地方,入口在“软件商店”的PHP版本右侧“设置”,然后切到“配置修改”或“性能调整”,改完点保存会自动重启PHP-FPM。
简米云、酷番云等云服务器的phpfpm配置,注意安全组不要放行9000端口,如果Nginx和PHP-FPM分别在不同实例,才需要开放内网端口;同机部署一律用Unix Socket或0.0.1。
另外云服务器内存通常有swap分区,OOM时系统会大量读写磁盘,响应变慢,所以进程数不要按物理内存算满,要预留20%-30%的余量。
把max_children算明白,通信方式选对,慢日志打开,max_requests设置好,phpfpm就能稳定跑很久,改配置前先备份,改完用php-fpm -t测试语法。
Q&A
宝塔phpfpm配置在哪里修改?
宝塔面板里,进入“软件商店”,找到对应PHP版本,点击右侧“设置”,选择“配置修改”或“性能调整”,性能调整”页面有可视化的并发方案设置,“配置修改”可直接编辑www.conf文件。
php-fpm配置参数详解中,哪些参数不建议新手动?
pm、pm.max_children、slowlog、request_slowlog_timeout、pm.max_requests这些适合调整。user、group、listen.owner、listen.group涉及权限,改错会导致502,不建议新手随便碰。
phpfpm内存占用高怎么解决?
先通过ps观察单个进程RSS,如果普通请求也占用过大,先排查代码,确认有内存泄漏时,设置pm.max_requests = 300到500让进程定期重启,同时降低pm.max_children避免OOM,慢日志开启后能定位到具体慢函数,事实是多数内存问题来自业务代码本身,配置参数只能缓解不能根除。
