背景:镜像此前完全吃 Debian/php-apache 的出厂 MPM 值(prefork: StartServers 5 / MinSpareServers 5 / MaxSpareServers 10 / MaxRequestWorkers 150 / MaxConnectionsPerChild 0),低配单用户机上光是常驻 10 个空闲 PHP 子进程就已过重。 ① 新增 mpm.conf.template(照 000-default.conf.template / ports.conf.template 的既有套路), Dockerfile COPY 进 /etc/apache2/ 并加构建期护栏(模板缺失 / 占位符被删 → 构建失败)。 ② entrypoint.sh 在 exec 之前渲染到 /etc/apache2/conf-enabled/mpm.conf —— Debian 的 apache2.conf 先 include mods-enabled 再 include conf-enabled,后者覆盖出厂 prefork 值。 内置默认:StartServers 2 / MinSpareServers 1 / MaxSpareServers 3 / MaxRequestWorkers 5 / MaxConnectionsPerChild 5 / KeepAlive Off。 ③ 六项各自独立覆盖(写哪个改哪个,没写的保持默认),并带校验与兜底: 非整数 / 越下限 / 一致性不满足(MaxRequestWorkers ≥ MaxSpareServers ≥ MinSpareServers) → 该项退回默认值 + [lsky] 警告;KeepAlive 只认 On/Off(大小写不敏感,统一渲染成 On/Off); MaxConnectionsPerChild 允许 0(0 = 永不回收,合法值)。 渲染或落盘失败只警告,绝不影响容器启动(set -eu 下全部走 if 守卫,另挡掉 「目标路径被目录占住时 mv 静默假成功」那条实测发现的坑)。 ④ APACHE_KEEPALIVE_TIMEOUT / APACHE_MAX_KEEPALIVE_REQUESTS 仅在 KeepAlive=On 且显式 设置时才写入;未设则不写该行,跟随 Apache 发行版默认(5 秒 / 100 个请求)。 ⑤ README 新增「Apache MPM」一节:默认值、变量表、脏值策略、默认态日志摘要与自查命令、 高配参考值、以及「MaxRequestWorkers × 单进程内存 ≈ 可用内存」的估算提醒; docker-compose.yaml 的 environment 加注释示例(不改任何生效值)。 ⑥ CI 新增真容器步骤「Verify Apache MPM defaults and overrides」:默认态与期望的 6 行 逐行 diff;单项覆盖生效且其余仍默认;脏值退回默认且日志有警告;KeepAlive=On 时 「不设 timeout → 两行都不出现」「设了 → 两行出现且值正确」;大小写归一化; 并跑 apache2ctl -t 确认渲染结果不会让 Apache 报语法错。 本机验证(无 docker,镜像层由 CI 验):bash -n 通过;用抽取的入口脚本真代码跑 15 个场景 (全默认 / 单项覆盖 / 六项全脏 / KeepAlive 各形态 / 前导零 / 一致性破坏 / 目标被目录占住 / 模板缺失)全部 exit 0 且输出符合预期;Dockerfile 的 8 组 md5 自检与补丁字节校验未受影响 (未碰 patches/ 与 src/)。
7 lines
263 B
Plaintext
7 lines
263 B
Plaintext
StartServers ${APACHE_START_SERVERS}
|
|
MinSpareServers ${APACHE_MIN_SPARE_SERVERS}
|
|
MaxSpareServers ${APACHE_MAX_SPARE_SERVERS}
|
|
MaxRequestWorkers ${APACHE_MAX_REQUEST_WORKERS}
|
|
MaxConnectionsPerChild ${APACHE_MAX_CONNECTIONS_PER_CHILD}
|
|
KeepAlive ${APACHE_KEEP_ALIVE}
|