温馨提示×

centos php-fpm如何调优

小樊
31
2025-12-29 04:01:26
栏目: 编程语言

CentOS 上 PHP-FPM 调优实战指南

一 基线准备与监控

  • 安装与启用组件:优先添加 EPEL 仓库,安装 php-fpm 及常用扩展(如 php-opcache、php-mysqlnd、php-gd、php-mbstring、php-xml、php-zip、php-curl),完成后启动并设为开机自启:sudo systemctl start php-fpm && sudo systemctl enable php-fpm。配置文件路径通常为 /etc/php-fpm.conf(全局)与 /etc/php-fpm.d/www.conf(进程池)。
  • 打通 Web 与 FPM:优先使用 Unix socket(如 /run/php-fpm/www.sock)以获得更低开销;Nginx 示例:fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;
  • 日志与观测:开启 慢日志错误日志,便于定位瓶颈与异常。
  • 状态页与监控:开启 pm.status_path(如 /status),配合 Nginx/Apache 访问;使用 systemctl status php-fpm、tail -f 错误日志、top/htop 观察进程与内存变化。

二 进程管理核心参数

  • 进程管理模式:推荐 pm = dynamic(负载波动场景);稳定高并发且资源充足时可用 static;低峰或资源紧张可用 ondemand(按需创建,首访可能有延迟)。
  • 关键参数与经验值:
    • pm.max_children:由内存与单进程内存决定,常用估算公式:(可用内存MB - 1GB) / 单进程内存MB;单进程内存可用 ps aux | grep php-fpm | awk '{print $6}' 粗估(单位 MB)。
    • pm.start_servers:建议 pm.max_children / 4 + 1
    • pm.min_spare_servers / pm.max_spare_servers:建议设为 CPU 核心数的 1–2 倍,兼顾冷启动与突发并发。
    • pm.max_requests:每个子进程处理请求上限,建议 500–1000,用于缓解潜在内存泄漏。
    • request_terminate_timeout:请求最大执行时间,建议 30–120s(视业务而定)。
  • 示例(4 核、8GB 内存、单进程约 80MB 的场景):
    • max_children ≈ (8192 - 1024) / 80 ≈ 90;start_servers ≈ 90/4+1=23;min/max spare ≈ 4–8
    • 配置片段:
      • pm = dynamic
      • pm.max_children = 90
      • pm.start_servers = 23
      • pm.min_spare_servers = 4
      • pm.max_spare_servers = 8
      • pm.max_requests = 500
      • request_terminate_timeout = 60s
        以上参数需结合实际监控逐步微调,避免一次性拉满。

三 OPcache 与 PHP 运行时

  • 启用与推荐配置(php.ini 的 [opcache] 段):
    • zend_extension=opcache.so
    • opcache.enable=1(生产必开)
    • opcache.enable_cli=0(CLI 关闭,节省内存)
    • opcache.memory_consumption=128(单位 MB,按内存与项目规模调大)
    • opcache.interned_strings_buffer=8
    • opcache.max_accelerated_files=10000+(需覆盖项目文件总数)
    • opcache.revalidate_freq=60(生产建议 ≥60s,配合文件变更流程使用)
    • opcache.fast_shutdown=1
  • PHP 运行时关键项(生产建议):
    • memory_limit=256M(大型应用可调 512M
    • max_execution_time=300(长任务按需延长)
    • upload_max_filesize=50M;post_max_size=50M(需大于上传需求)
    • display_errors=Off;log_errors=On;error_log=/var/log/php_errors.log
  • 生效方式:修改后执行 sudo systemctl restart php-fpm

四 前后端协同与网络优化

  • Nginx 建议:
    • 进程与连接:worker_processes auto; events { worker_connections 1024; use epoll; }
    • 压缩与缓冲:gzip on; gzip_types text/plain text/css application/json application/javascript;
    • FastCGI 缓冲:fastcgi_buffers 256 16k; fastcgi_buffer_size 128k;(按并发与响应体调优)。
  • Apache 建议:启用 mod_proxy_fcgimod_rewrite,使用 Unix socketfcgi:// 方式与 FPM 对接。
  • 传输与协议:优先 Unix socket;若用 127.0.0.1:9000,确保与 FPM 的 listen 一致。

五 缓存、安全与持续调优

  • 数据层缓存:部署 Redis/Memcached,安装对应扩展(如 php-pecl-redis、php-pecl-memcached),在应用或 php.ini 中将会话存储改为 Redis:session.save_handler=redis; session.save_path="tcp://127.0.0.1:6379"
  • 安全加固:
    • 禁用危险函数:disable_functions=exec,passthru,shell_exec,system,chroot,escapeshellcmd,escapeshellarg(按需保留)。
    • 隐藏版本:expose_php=Off;合理文件权限(如 nginx:nginx /var/www/html,755)。
    • 定期更新:sudo yum update -y
  • 持续调优流程:
    • 打开 慢日志request_slowlog_timeout=5s;slowlog=/var/log/php-fpm/www-slow.log,定位长 SQL、外部 API 调用与循环瓶颈。
    • 观察 FPM 状态页(启用 pm.status_path)与系统资源,按“监控 → 调整 → 验证”的闭环迭代 max_children、spare、max_requests、超时 等参数。

0