温馨提示×

Ubuntu如何利用PHP-FPM提升网站速度

小樊
42
2025-12-20 11:34:26
栏目: 云计算

Ubuntu下用 PHP-FPM 提升网站速度的可落地方案

一 安装与基础配置

  • 安装对应版本的 PHP 与 PHP-FPM(示例为 PHP 8.1):sudo apt update && sudo apt install php8.1 php8.1-fpm。按需加装扩展:sudo apt install php8.1-mysql php8.1-curl php8.1-xml php8.1-gd
  • 使用 Unix socket 提升本机通信性能:编辑 /etc/php/8.1/fpm/pool.d/www.conf,设置 listen = /run/php/php8.1-fpm.sock
  • 选择进程管理模式:推荐 pm = dynamic,并按服务器内存与负载设置进程数(见下一节公式与示例)。
  • 基础超时与日志:设置 request_terminate_timeout = 30s(防止长脚本拖垮);开启慢日志 slowlog = /var/log/php-fpm/slow.log,request_slowlog_timeout = 10s,便于定位性能瓶颈。

二 进程与内存的关键调优

  • 核心参数与作用
    • pm:进程管理方式,优先 dynamic(按负载伸缩)。
    • pm.max_children:最大子进程数,决定并发上限。
    • pm.start_servers / pm.min_spare_servers / pm.max_spare_servers:控制启动与空闲池规模,平滑应对流量波动。
    • request_terminate_timeout:请求最大执行时间,超时终止,保护资源。
    • request_slowlog_timeout + slowlog:定位“慢脚本”。
  • 计算 max_children 的实用方法
    • 估算单进程内存:压测或观察峰值 RSS(如约 20–30MB/进程)。
    • 预留系统与其他服务内存(如留出 1–2GB)。
    • 公式:max_children ≈ (可用内存 − 预留) / 单进程内存。
    • 示例:可用 4GB、单进程 30MB,则 max_children ≈ (4096−2048)/30 ≈ 68(取整为 64–70 更稳妥)。
  • 参考配置(示例值,需结合实际压测微调)
    • pm = dynamic
    • pm.max_children = 64
    • pm.start_servers = 8
    • pm.min_spare_servers = 8
    • pm.max_spare_servers = 32
    • request_terminate_timeout = 30s
    • slowlog = /var/log/php-fpm/slow.log;request_slowlog_timeout = 10s

三 启用 OPcache 并优化 PHP 运行时

  • 编辑 /etc/php/8.1/fpm/php.ini
    • opcache.enable = 1(生产必开)
    • opcache.memory_consumption = 128(单位 MB)
    • opcache.interned_strings_buffer = 8
    • opcache.max_accelerated_files = 4000–10000(按代码量调整)
    • opcache.revalidate_freq = 60(开发环境可设更小以快速生效)
    • 生产环境建议:display_errors = Off,log_errors = On;按业务需要设置 memory_limit(如 256M)、upload_max_filesize / post_max_size(如 50M)。

四 Web 服务器与系统集成

  • Nginx 示例(确保 fastcgi_pass 指向 Unix socket):
    • location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
    • 修改后执行:sudo nginx -t && sudo systemctl restart nginx
  • Apache 示例(启用 FCGI 代理):
    • 启用模块:sudo a2enmod fcgid;或使用 mod_proxy_fcgi
    • 配置:
      • <FilesMatch .php$> SetHandler “proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost”
      • 或 ProxyPassMatch ^/(..php(/.)?)$ fcgi://localhost/var/www/html/$1
    • 修改后执行:sudo apache2ctl configtest && sudo systemctl restart apache2

五 监控、验证与持续调优

  • 配置状态页与日志:在 www.conf 中开启 pm.status_path = /status(配合 Nginx/Apache 访问限制),并配置 error_log、access_log 与 slowlog,便于观测排队、慢请求与错误。
  • 系统资源与连接:提升 文件描述符限制(如 systemd 的 LimitNOFILE),避免因 fd 耗尽影响并发;使用 top/htop/atop 观察 CPU、内存、负载与 PHP-FPM 进程数。
  • 基线压测与迭代:使用 ab/wrk/siege 建立基线,按“先 OPcache → 再进程数 → 后超时与日志”的顺序逐项微调,观察 P95/P99 延迟、RPS、502/504 错误率 的变化,逐步收敛到最优参数。

0