如何优化Linux服务器PHP-FPM
小樊
34
2025-12-30 00:13:00
Linux服务器 PHP-FPM 优化实操指南
一 基线测量与容量规划
- 明确关键指标:每秒请求数(RPS)、平均响应时间(RT)、CPU/内存利用率、PHP-FPM 队列长度、慢查询与错误日志。
- 建立可复现的压测场景(如 ab/wrk/siege),在调整前后对比指标,避免“拍脑袋”改参数。
- 计算资源边界:先留出系统与其他服务(如数据库、缓存、日志)所需内存,再给 PHP-FPM 分配可用内存,避免 OOM 与抖动。
二 PHP-FPM 进程与超时关键参数
- 进程管理策略(pm)
- static:进程数固定为 pm.max_children,适合内存充足、追求稳定与低开销的场景。
- dynamic:按需伸缩,适合内存受限或波动负载;需合理设置起停与空闲进程数。
- ondemand:按需拉起,冷启动延迟较高,适合极低并发或节省资源的场景。
- 进程数量估算与示例
- 估算可用内存:AvailableMem ≈ 总内存 − 系统/数据库/缓存占用。
- 单进程内存估算:AvgProcMem(MB)≈ 观察稳定运行时单个 FPM 进程常驻内存。
- 上限:pm.max_children ≤ AvailableMem / AvgProcMem。
- 示例:可用内存 8GB、单进程 30MB,则上限约 ≈ 273;为留有余量可先设 ≈ 200,再压测微调。
- 动态模式常用搭配
- 经验关系:pm.start_servers ≈ min_spare + (max_spare − min_spare)/2。
- 示例:min_spare=5,max_spare=35,则 start_servers ≈ 20。
- 稳定性与回收
- pm.max_requests:定期重启子进程,缓解第三方库内存泄漏,如 500–5000(视应用稳定性与内存增长而定)。
- 请求超时
- request_terminate_timeout:全局脚本最大执行时间,建议与业务 SLA 对齐,如 30s;设为 0 表示不主动终止(需配合慢日志定位长请求)。
三 php.ini 与 OPcache 优化
- 基础资源
- memory_limit:依据业务对象大小与框架占用设置,如 128–256M。
- max_execution_time:与 FPM 超时协同,如 30s。
- OPcache 必开与常用值
- 启用:opcache.enable=1
- 缓存容量:opcache.memory_consumption=128(单位 MB)
- 字符串驻留:opcache.interned_strings_buffer=8
- 加速文件数:opcache.max_accelerated_files=10000
- 校验频率:opcache.revalidate_freq=60(开发环境可设更小,生产建议 60s 左右)
- 快速关闭:opcache.fast_shutdown=1
- 可选安全与调试
- 生产建议关闭显示错误:display_errors=Off,log_errors=On;必要时记录到指定日志。
四 Web 服务器与系统层优化
- Nginx 与 PHP-FPM 对接要点
- 使用 Unix Socket(如 /run/php/php{version}-fpm.sock)通常较 TCP 127.0.0.1:9000 开销更低;确保权限与用户组一致(如 www-data)。
- 典型 location 配置:fastcgi_pass 指向 socket;传递 SCRIPT_FILENAME 与必要的 FastCGI 参数。
- Apache 可选方案
- 使用 mod_proxy_fcgi 代理到 PHP-FPM(socket 或端口),并合理设置 SetHandler/ProxyPassMatch。
- 系统资源与连接
- 提升文件描述符限制(如 fs.file-max)、内核网络参数(如 net.core.somaxconn),避免“Too many open files/connection refused”。
- 降低 vm.swappiness,减少换页;使用 SSD 提升 I/O 性能。
- 连接与扩展
- 启用 Keepalive 减少握手开销;对数据库/缓存使用持久连接或连接池;对耗时任务采用异步队列(如消息队列)剥离主进程。
五 监控 日志 与 调优流程
- 日志与排障
- 开启 slowlog(如 /var/log/php-fpm/www-slow.log),设置阈值(如 10s)定位慢请求与阻塞点。
- 合理设置 error_log 级别与轮转,避免磁盘被撑满;必要时开启 catch_workers_output 捕获子进程输出。
- 监控与可视化
- 基础:top/htop、vmstat、iostat 观察 CPU、内存、I/O 与负载。
- 进阶:采集 PHP-FPM 状态页与 Nginx access/error,结合 Prometheus + Grafana 做容量与异常告警。
- 安全与维护
- 仅启用必要扩展,禁用危险或不使用的函数(如 disable_functions 合理设置)。
- 调整任何参数前先备份;变更遵循“小步快跑 + 压测验证 + 回滚预案”。
附 可直接套用的安全起步配置示例
- PHP-FPM pool(/etc/php/{version}/fpm/pool.d/www.conf 片段)
- 进程管理:pm=dynamic;pm.max_children=50;pm.start_servers=20;pm.min_spare_servers=5;pm.max_spare_servers=35;pm.max_requests=500
- 超时控制:request_terminate_timeout=30s
- 慢日志:slowlog=/var/log/php-fpm/www-slow.log;request_slowlog_timeout=10s
- 监听与权限:listen=/run/php/php{version}-fpm.sock;listen.owner=www-data;listen.group=www-data;listen.mode=0660;user=www-data;group=www-data
- php.ini 关键项
- memory_limit=128M;max_execution_time=30;display_errors=Off;log_errors=On
- OPcache:opcache.enable=1;opcache.memory_consumption=128;opcache.interned_strings_buffer=8;opcache.max_accelerated_files=10000;opcache.revalidate_freq=60;opcache.fast_shutdown=1
- 提示
- 上述为“安全起步值”,请结合第二节的容量估算与压测结果逐步微调;切勿一次性拉满 max_children。