在这台 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 = 10max_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=60revalidate_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。实验示例与本站运行记录分别说明;原始归档日期保留。
评论 (0)