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 错误率 的变化,逐步收敛到最优参数。