温馨提示×

Ubuntu PHP-FPM性能调优技巧

小樊
46
2025-11-28 19:19:38
栏目: 编程语言

Ubuntu 上 PHP-FPM 性能调优要点

一 基础准备与监控

  • 保持 PHP 版本为稳定最新,及时获得性能修复与安全改进。
  • 启用并正确配置 OPcache(生产环境强烈建议开启),减少脚本重复编译开销。
  • 使用 Unix SocketNginx/Apache 通信,较 TCP 降低网络栈开销。
  • 打开 慢请求日志 slowlog访问/错误日志,便于定位瓶颈与异常。
  • 提升系统 文件描述符限制(如通过 systemd 或 limits.conf),避免“Too many open files”。
  • 接入 监控与告警(如 top/htop、Prometheus + Grafana、php-fpm 状态页),持续观察队列、进程数与响应时延。

二 进程池关键参数与计算

  • 进程管理策略选择
    • static:固定进程数,适合高并发、内存充足场景。
    • dynamic:按需伸缩,适合资源受限或波动负载。
    • ondemand:空闲即回收,极致省内存,但冷启动与突发流量下可能出现 504 Gateway Timeout
  • 核心参数与作用
    • pm.max_children:同一时刻最大子进程数,决定并发上限与峰值内存占用。
    • pm.start_servers / pm.min_spare_servers / pm.max_spare_servers:控制启动与空闲区间,平滑应对流量波动。
    • pm.process_idle_timeout(ondemand):空闲超时回收进程。
    • pm.max_requests:进程处理一定请求后自动重启,用于缓解长期运行导致的内存膨胀。
  • 计算方法与示例(示例为估算,务必以实际测量为准)
    • 估算单进程 RSS(常驻内存):例如 ps --no-headers -o "rss,cmd" -C php-fpm | awk '{sum+=$1} END {printf "%.0fM\n", sum/NR/1024}',得到如 60M
    • 预留安全内存(系统、数据库、缓存、Nginx 等)后,按:max_children ≈ 可用内存 / 单进程 RSS 设定上限。
    • 示例:可用 2GB、单进程 60M,则 max_children ≈ 2000/60 ≈ 33;可按并发与峰值再微调。
    • 动态模式常用区间:start_servers5–10min_spare_serversmax_spare_servers 围绕峰值与回落速度设置,且需满足 max_spare_servers < max_children
    • 若观察到内存“只增不减”,可适当降低 pm.max_requests(如 500–2000)以周期性回收进程内存。

三 PHP 运行时与 OPcache 建议

  • 建议的 php.ini 关键项(按应用适度调整)
    • memory_limit:如 128M–256M(依据业务对象大小与框架占用)。
    • max_execution_time:如 30–300s(长任务建议异步化)。
    • post_max_size / upload_max_filesize:与业务上传需求匹配。
  • OPcache 推荐配置(生产环境)
    • opcache.enable=1
    • opcache.memory_consumption=128(单位 MB)
    • opcache.interned_strings_buffer=8
    • opcache.max_accelerated_files=4000–10000(按代码量调整)
    • opcache.revalidate_freq=60(开发环境可设更小以快速生效)
  • 说明:OPcache 显著提升脚本执行效率,是性价比最高的优化项之一。

四 Web 服务器与连接优化

  • 使用 Unix Socket 连接 PHP-FPM(如 listen = /run/php/php{version}-fpm.sock),并正确设置权限(如 listen.owner=www-data 等)。
  • Nginx 中启用 HTTP/2Keep-Alive,复用连接、降低握手开销;静态资源交由 Nginx 直接服务,减少 PHP-FPM 压力。
  • 反向代理与 FastCGI 参数保持标准与安全(如正确设置 SCRIPT_FILENAMEfastcgi_pass 指向 socket 或 TCP)。

五 快速检查清单与示例配置

  • 快速检查清单
    • 已启用 OPcache 且参数合理;PHP-FPM 与 Nginx/Apache 使用 Unix Socket 通信。
    • 已打开 slowlogerror.log,并按需调整日志级别。
    • 已提升 文件描述符限制,避免连接/文件句柄瓶颈。
    • 已配置 监控(如 php-fpm 状态页、Prometheus/Grafana、top/htop),能观测队列与进程数。
    • 已用 pshtop 实测 单进程 RSS,并据此计算与验证 pm.max_children
    • 配置变更后使用 sudo systemctl restart php{version}-fpm(必要时重启 Nginx/Apache)并做 A/B 验证
  • 示例配置片段(/etc/php/{version}/fpm/pool.d/www.conf,按需调整数值)
    • 进程池与连接
      • pm = dynamic
      • pm.max_children = 32
      • pm.start_servers = 5
      • pm.min_spare_servers = 5
      • pm.max_spare_servers = 20
      • pm.max_requests = 1000
      • listen = /run/php/php{version}-fpm.sock
      • listen.owner = www-datalisten.group = www-datalisten.mode = 0660
    • 请求与日志
      • request_terminate_timeout = 30s(长任务建议走队列/异步)
      • slowlog = /var/log/php-fpm/www-slow.log
      • slowlog_timeout = 5s
      • catch_workers_output = yes
    • 应用与扩展
      • php_admin_value[memory_limit] = 128M
      • php_admin_value[max_execution_time] = 60
      • 启用 OPcache(见上一节建议值)
    • 变更后重启:sudo systemctl restart php{version}-fpm

0