PHP-FPM 与 OPcache 调整笔记:20 个进程不是通用答案

阿远
2026-10-28 / 0 评论 / 5 阅读 / 正在检测是否收录...

在这台 2 核 4G 的 LNMP 服务器上,我调整了 PHP-FPM 进程池,并启用了 OPcache。最初记录里把 max_children=20 写得很确定,现在更愿意把它看成需要观察验证的起点,而不是所有 4G 服务器的标准答案。

PHP 和 PHP-FPM 分别做什么

PHP 是执行 Typecho 代码的语言运行环境;PHP-FPM 维护一组工作进程,接收 Nginx 转来的 FastCGI 请求。本站通过 /run/php-fpm/www.sock 通信。

PHP 的通用设置主要在 /etc/php.ini,FPM 进程池在 /etc/php-fpm.d/www.conf,OPcache 设置在 /etc/php.d/10-opcache.ini。命令行 PHP 与 Web 进程可能加载不同配置或覆盖值,所以 php -i 的结果不能单独证明网页侧全部相同。

动态进程池如何读

本站采用的参数为:

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

max_children 限制同时处理请求的工作进程数;start_servers 是启动时创建数量,min/max_spare_servers 控制空闲进程范围。dynamic 会按需求调整,并不是启动后始终有 20 个忙碌进程。

进程太少可能排队,太多可能与 MySQL、Grafana 等争内存。应给系统、数据库和监控留余量,再根据实际 PHP 进程占用、请求耗时与业务并发判断。RSS 中有共享内存,简单相加也可能高估真实总占用。

OPcache 缓存的是什么

OPcache 缓存 PHP 编译后的字节码,减少重复解析开销,不是把所有文章页面直接缓存成 HTML。本站设置启用缓存,并开启时间戳检查。

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60

revalidate_freq=60 表示按检查间隔判断文件是否更新,代码发布后可能不会立即看到新版本。发布流程应考虑缓存刷新或受控重启,不能在生产环境随意放一个公开的缓存重置页面。

修改后怎样验证

php-fpm -t
systemctl status php-fpm --no-pager
journalctl -u php-fpm --since '15 minutes ago' --no-pager

先检查配置语法,再选择适当时机使服务重新读取配置,然后验证实际页面、错误日志和内存趋势。看到 active 只能说明进程在运行,还需要确认网站请求正常。

目前没有安装 PHP-FPM Exporter,因此不把“队列长度已有看板”写成完成事项。后续如果出现明显排队、502 或进程上限问题,再结合 FPM 状态与日志增加观测,而不是先把所有参数一口气加大。

Web 配置与 CLI 检查分开

php --ini 与 php -i 反映 CLI 环境,FPM 还可能应用 pool 级覆盖设置。需要确认 Web 侧值时,使用仅管理员可访问的临时诊断方式,检查完即移除;不要公开 phpinfo 页面。OPcache 重启或重载的影响应结合 FPM 模式与发布流程验证。20 个子进程与 128 MB 缓存都只是本站记录值,不是测出的通用最优值。

内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
1

评论 (0)

取消