摘要
在常规容器重启(主机重启 / docker restart)之后,app 容器内的 nginx 无法启动,并出现以下错误:
nginx: [emerg] unknown directive "brotli_static" in /etc/nginx/conf.d/discourse.conf:172
这导致整个站点宕机(没有回退机制——nginx 始终无法绑定到 80/443 端口),直到手动修补配置。
环境
- 基础镜像:
discourse/base:2.0.20260812-0036 - nginx:
1.26.3-3+deb13u7(Debian 13/trixie 软件包,非自定义编译) - 已安装
libnginx-mod-http-brotli-static/-filter1.0.0~rc-6,且/etc/nginx/mods-enabled/*.conf符号链接(包含正确的load_module指令)存在并指向有效的.so文件。
根本原因
/etc/nginx/nginx.conf(由 nginx-common 软件包拥有,未做修改)中没有 include /etc/nginx/modules-enabled/*.conf; 指令,因此已安装的 Brotli 模块从未被加载——而 discourse.conf(由 Discourse 模板生成)仍然输出 brotli_static on;,假设这些模块已加载。
为什么不会立即失败
只有当 nginx 实际(重新)启动时,配置才会被重新解析。一个新构建的容器可以正常运行数天或数周,直到某些事件触发 nginx 重启(主机重启、docker restart、OOM 等),此时它会无声地进入崩溃循环(约每秒 1 次),且没有自动恢复机制。
临时解决方案
在 /etc/nginx/nginx.conf 的第一行(主上下文,在 events {} 之前)添加 include /etc/nginx/modules-enabled/*.conf;。已确认此操作可恢复 nginx -t 的成功执行及正常操作。
请求
基础镜像能否做到以下任一操作:(a) 在其 nginx.conf 中添加此 include 指令,或 (b) 如果发行版的 nginx 软件包构建不再默认捆绑 Brotli 支持,则从随附的 discourse.conf 模板中移除 brotli_static/brotli?