PHP-FPM 调优指南彻底解决网站卡顿、502 / 504 / 500 报错很多 Laravel / ThinkPHP / WordPress 站点上线后CPU 飙高、接口超时、随机 502第一反应往往是“加机器”。但经验表明80% 的问题来自 PHP-FPM 配置不合理。本文从原理 → 参数 → 实战 → 排错四个层面给你一套线上可直接套用的 PHP-FPM 调优方案。一、先搞懂PHP-FPM 为什么会卡、会崩PHP-FPM 本质是进程池模型Nginx → PHP-FPM → Worker 进程 → 执行业务代码当Worker 不够用 / 被占满 / 崩溃 时就会出现现象原因网站变慢Worker 被耗尽请求排队502 Bad GatewayFPM 挂掉 / socket 不可用504 Gateway TimeoutPHP 执行超时500 Internal Error内存不足 / OOM调优的核心目标让 Worker 数量、内存、超时时间与业务负载完全匹配。二、PHP-FPM 核心配置文件位置常见路径/etc/php/8.2/fpm/php-fpm.conf /etc/php/8.2/fpm/pool.d/www.conf重启命令systemctl restart php8.2-fpm三、最重要的 10 个参数重点3.1 pm进程管理模式✅pm dynamic模式说明推荐static固定进程数❌ 不推荐dynamic动态调整✅ 推荐ondemand按需启动❌ 高并发差✅生产环境统一用dynamic3.2 pm.max_children最容易配错的参数pm.max_children 50计算公式非常关键max_children ≈ 可用内存 ÷ 单个 PHP 进程平均内存 查看单进程内存ps -ylC php-fpm --sort:rss示例服务器内存8GPHP 单进程60MB系统预留2G(8G - 2G) ÷ 60MB ≈ 100⚠️设置过大 内存撑爆 OOM 5023.3 pm.start_serverspm.start_servers 20建议值pm.start_servers pm.min_spare_servers (pm.max_spare_servers - pm.min_spare_servers) / 23.4 pm.min_spare_servers / pm.max_spare_serverspm.min_spare_servers 10 pm.max_spare_servers 30作用控制空闲进程回收速度防止频繁 fork。3.5 pm.max_requests防内存泄漏✅pm.max_requests 500含义每个 Worker 处理多少请求后自动重启。✅ 强烈建议开启防止Laravel 容器膨胀Redis / PDO 连接未释放第三方 SDK 内存泄漏3.6 request_terminate_timeout解决卡死request_terminate_timeout 30s✅ 防止SQL 慢查询第三方 API 卡死curl 无限等待⚠️ 必须大于php.ini中的max_execution_time 253.7 listen 模式选择非常关键✅推荐 TCP稳定listen 127.0.0.1:9000❌ Unix Socket高并发易出 502listen /run/php/php8.2-fpm.sock如果必须用 sock务必设置权限listen.owner www-data listen.group www-data listen.mode 06603.8 backlog高并发必调listen.backlog 1024默认值太小会导致请求被直接拒绝。3.9 慢日志排查卡顿神器slowlog /var/log/php-fpm/slow.log request_slowlog_timeout 5s✅ 超过 5 秒的请求会被记录直接定位慢 SQL死循环阻塞 IO3.10 错误日志级别catch_workers_output yes php_admin_flag[log_errors] on四、Nginx 配合调优502 常因这里4.1 FastCGI 超时设置fastcgi_connect_timeout 10; fastcgi_send_timeout 30; fastcgi_read_timeout 30;4.2 Buffer 调整fastcgi_buffering on; fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;4.3 防止 upstream 错误proxy_intercept_errors on; fastcgi_intercept_errors on;五、线上推荐配置模板4C 8G 服务器pm dynamic pm.max_children 80 pm.start_servers 20 pm.min_spare_servers 10 pm.max_spare_servers 30 pm.max_requests 500 request_terminate_timeout 30s listen 127.0.0.1:9000 listen.backlog 1024 slowlog /var/log/php-fpm/slow.log request_slowlog_timeout 5s catch_workers_output yes六、如何判断当前 FPM 是否够用6.1 查看活跃进程数ps aux | grep php-fpm | wc -l6.2 查看 Nginx 错误日志tail -f /var/log/nginx/error.log关键词upstream timed outconnection refusedno live upstreams6.3 查看 PHP-FPM 状态页强烈推荐启用pm.status_path /statusNginxlocation /status { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }访问后你会看到pool: www process manager: dynamic start time: ... idle processes: 12 active processes: 38 total processes: 50 max active processes: 50✅max active processes 长期接近 max_children → 立刻加进程七、常见故障排查清单 ✅502 Bad Gateway[ ] PHP-FPM 是否存活[ ] listen 地址是否一致[ ] socket 权限是否正确[ ] backlog 是否过小[ ] max_children 是否耗尽504 Gateway Timeout[ ] request_terminate_timeout 是否太短[ ] SQL 慢查询[ ] 第三方 API 阻塞[ ] curl 未设 timeout网站间歇性卡顿[ ] 未设置 pm.max_requests[ ] Redis / MySQL 连接未释放[ ] Laravel 容器内存膨胀[ ] Opcache 未开启八、Laravel 项目特别注意事项✅ Opcache 必须开启✅config:cache、route:cache✅ 禁用DB::listen在生产环境✅ 队列 worker 单独进程不要混用 FPM✅ 不要在 FPM 里跑长任务导出 / 同步九、一句话总结PHP-FPM 调优的本质不让进程饿死太少不让内存炸裂太多不让请求卡死超时不让错误隐形日志