利用 Linux 系统特性提升 PHP-FPM 性能
一 进程与资源配置
- 选择进程管理模式:高并发短请求优先用 pm=dynamic,稳定长时任务可用 pm=static;突发流量小、资源紧张可用 pm=ondemand(注意冷启动延迟)。
- 计算并设定 pm.max_children:先估算单个 PHP 进程常驻内存(含框架与扩展),用公式:max_children ≈ 可用内存 / 单进程常驻内存;预留 20%–30% 给系统与其他服务。
- 动态模式的常用配比:pm.start_servers 设为 CPU 核心数的 2–4 倍;pm.min_spare_servers 与 pm.max_spare_servers 分别设为 2–4 倍 与 4–8 倍 核心数,兼顾冷启动与突发峰值。
- 稳定性与健康:开启 pm.max_requests=500–1000 定期重启子进程,缓解内存泄漏;设置 request_terminate_timeout 作为全局硬超时,配合慢日志定位长请求。
二 PHP 运行时与字节码缓存
- 启用并优化 OPcache:设置 opcache.enable=1;将 opcache.memory_consumption 设为服务器内存的 1/8–1/4;按实际文件量调大 opcache.max_accelerated_files(如 10000+);生产环境可将 opcache.revalidate_freq 设为 60 秒以平衡变更生效与性能。
- 合理脚本限制:将 memory_limit 设为业务所需的最小值(如 128M–256M);将 max_execution_time 设为业务可接受的阈值(如 30s),避免个别慢脚本拖垮进程池。
三 系统与网络栈优化
- 提升文件与连接承载能力:提高系统级文件描述符上限(如 fs.file-max=100000),并在服务单元或 limits.conf 中提升 php-fpm 的 rlimit_files;增大 net.core.somaxconn=65535 提升 backlog 能力。
- 降低内存交换倾向:将 vm.swappiness=10,优先使用物理内存,减少抖动。
- 选择高效传输通道:Nginx 与 PHP-FPM 之间优先使用 Unix 域套接字(如 /run/php/phpX.Y-fpm.sock),减少网络栈开销与端口占用。
- 优化 TCP 行为:适当减小 net.ipv4.tcp_fin_timeout、开启 net.ipv4.tcp_tw_reuse,加速连接回收与复用。
四 前后端与架构层协同
- Web 服务器优化:启用 HTTP/2 与 Gzip/Brotli 压缩,减少往返与传输体积,提升页面加载速度。
- 数据层减负:为数据库与热点数据引入 Redis/Memcached 缓存;使用 持久连接 与合理的连接池大小,降低握手与建立连接开销。
- 扩展与弹性:单机到瓶颈时,通过 Nginx/HAProxy 做多实例负载均衡与水平扩展。
五 监控 日志 与变更流程
- 打开并定期分析 Slow Log(如 request_slowlog_timeout=10s),定位慢脚本与阻塞点;结合 access/error.log 观察 5xx、超时与重启频率。
- 建立可观测性:采集 PHP-FPM 状态页 与系统指标,使用 Prometheus + Grafana 做容量与瓶颈可视化;辅以 htop/vmstat/iostat 做现场诊断。
- 安全与权限:以 非 root 运行(如 www-data);若使用 Unix socket,设置 listen.owner/listen.group/listen.mode=0660;限制监听端口访问。
- 变更与回滚:任何参数调整先在测试环境验证,遵循“小步变更—观察—再调整”的闭环;保持 PHP 与扩展 的及时更新。