CentOS 上提升 PHP-FPM 运行速度的系统化做法
一 进程管理与资源配置
- 选择进程管理模式:流量波动用 dynamic,长时稳定高并发用 static,低峰节省资源用 ondemand。
- 合理设置进程数:先估算每个 PHP 进程的内存占用(常见 10–50MB),用“可用内存 / 单进程内存”得到 pm.max_children 的上限,避免 OOM。
- 动态模式的常用配比:pm.start_servers 设为 CPU 核数的 2–4 倍;pm.min_spare_servers 与 pm.max_spare_servers 分别设为核数的 2 倍 与 4 倍;pm.max_requests 设为 500–1000 以定期回收潜在内存泄漏;request_terminate_timeout 设为 30–60 秒 防止长请求拖垮;开启 slowlog 并设置 request_slowlog_timeout=10–20 秒 定位慢请求。
- 示例(需按实际资源调整):
- dynamic:pm.start_servers=8;pm.min_spare_servers=4;pm.max_spare_servers=16;pm.max_children=50–100;pm.max_requests=500;request_terminate_timeout=30;slowlog=/var/log/php-fpm/www-slow.log;request_slowlog_timeout=10。
- static:pm=static;pm.max_children=50–100(稳定高并发、低延迟场景)。
二 通信方式与内核网络参数
- 优先使用 Unix Socket(如:listen=/run/php/phpX.Y-fpm.sock),相比 127.0.0.1:9000 减少网络栈开销;确保 Nginx 与 FPM 使用一致的 socket 路径与权限(如 0660)。
- 提升连接队列:设置 listen.backlog=2048(或 -1 交由系统),缓解突发连接排队。
- 放宽文件描述符限制:在 systemd 服务或 limits.conf 中提升 nofile,避免 “Too many open files”。
- 可选优化:设置进程优先级 process.priority=-10(需评估系统策略)。
三 PHP 运行时与字节码缓存
- 启用并优化 OPcache(php.ini 或 /etc/php.d/opcache.ini):
- opcache.enable=1;opcache.memory_consumption=128;opcache.interned_strings_buffer=8;opcache.max_accelerated_files=4000–10000;opcache.revalidate_freq=60(生产常用,开发可缩短);必要时开启文件校验与预热。
- 合理脚本限制:memory_limit=128–256M;max_execution_time=30–60;display_errors=Off;log_errors=On。
- 安全与稳定:生产环境关闭错误直接输出,统一记录到日志。
四 应用层与前后端协同优化
- 静态资源由 Nginx 直接服务(开启 gzip),PHP-FPM 仅处理动态请求,降低后端压力。
- 引入 Redis/Memcached 做页面/数据缓存,减少数据库访问与重复计算。
- 优化数据库:建立合适索引、优化慢查询、合理连接池与超时;应用侧使用查询缓存与批量操作。
- 开启 pm.status_path=/status 并配合 Nginx 访问限制,便于监控排队、进程数与慢请求。
五 监控 验证与渐进式调优
- 监控与观测:使用 top/htop、FPM status 页面、以及 Prometheus+Grafana 观察 CPU/内存/队列/慢日志;必要时用 strace 定位系统调用瓶颈。
- 基线测试:在测试环境用 ab/wrk/siege 建立并发基线,每次只变更一个参数并对比 RPS/延迟/错误率。
- 变更流程:先备份配置,灰度发布,观察 error.log/slowlog 与监控指标,确认稳定后再扩大范围。