Linux服务器上跑PHP应用,最怕的是什么?高并发一来,PHP-FPM直接“炸”掉,502、504满天飞。其实问题往往不是PHP本身不够快,而是连接数没调对。今天咱们就把PHP-FPM的优化方法掰开揉碎讲清楚,帮你把服务器的并发处理能力真正提上去。

1. 找到配置文件,这是第一步
大多数Linux发行版下,PHP-FPM的主配置文件是:
/etc/php/7.x/fpm/php-fpm.conf/etc/php/7.x/fpm/pool.d/www.conf
注意,具体路径里的PHP版本号(7.x)要根据你的实际安装版本来。真正需要动手的地方,其实是在 pool.d/www.conf 里,这里定义了进程池的行为。
2. 核心参数:把“进水口”和“出水口”都调准
a. pm.max_children —— 最大子进程数
这个参数决定了PHP-FPM能同时处理多少个请求。设得太小,并发一高就排队;设得太大,内存直接爆掉。怎么算?一个简单参考:单进程内存占用 × max_children ≤ 可用内存的70%。比如每个PHP进程平均吃50MB,服务器有4GB内存,那么max_children可以设到50左右。保守一点,先设小,再逐步加压。
pm.max_children = 50
b. pm.start_servers —— 启动时创建的子进程数
这个值不宜过大,避免服务刚启动就把资源占满。一般建议设为 min_spare_servers 和 max_spare_servers 的中间值。
pm.start_servers = 5
c. pm.min_spare_servers 和 pm.max_spare_servers —— 空闲进程的上下限
好比一个水池,水平太低,突然来水会来不及反应;水平太高,又白白浪费水。min_spare_servers 保证有空闲进程随时待命,max_spare_servers 防止闲置进程太多吃掉资源。通常 min 设为5,max 设为 max_children 的70%左右。
pm.min_spare_servers = 5
pm.max_spare_servers = 35
d. pm.max_requests —— 每个子进程能干的活数
这个参数经常被忽略,但它是防止内存泄漏的“救命稻草”。每个子进程处理完一定数量的请求后自动重启,把积累的垃圾内存清理掉。建议设为500~1000,具体看应用的内存管理情况。
pm.max_requests = 500
3. 监听队列:别让请求在门口排队到死
如果用的是Unix Socket(推荐),listen.backlog 可以控制TCP连接队列的长度。默认值通常只有128,在高并发场景下很容易丢包。翻到65535,可以极大缓解瞬时高并发时的连接溢出。
listen.backlog = 65535
如果用的是TCP/IP,记得同时调整 listen.allowed_clients 和 listen.owner 等参数,确保安全。
4. 系统层面:别让操作系统拖后腿
PHP-FPM调得再好,系统内核不配合也是白搭。两个关键点:
a. 文件描述符限制
每个进程都需要打开文件句柄,默认限制只有1024,明显不够用。编辑 /etc/security/limits.conf,添加:
* soft nofile 65535
* hard nofile 65535
然后需要重新登录或重启服务生效。
b. 内核网络参数
编辑 /etc/sysctl.conf,加入以下内容:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
执行 sysctl -p 让配置即时生效。
5. 调完别急着走,监控才是关键
参数改完,不等于万事大吉。需要用工具盯住服务器表现:
top/htop看CPU和内存netstat -anp | grep php-fpm看连接数- PHP-FPM自带的
pm.status页面可以看实时进程状态
观察一段时间,如果平均空闲进程长期在min_spare_servers附近徘徊,说明可以适当增大max_children;如果max_requests设得太小,子进程频繁重启也会影响性能,需要根据实际请求耗时来权衡。
说白了,PHP-FPM优化没有“银弹”,每台服务器、每个应用都有自己的脾气。但只要你掌握了这几个核心参数,再配合系统层面的调整,高并发下稳定运行不是什么难事。从今天开始,别再用默认配置硬扛了,动手试试吧。
