概要
ルーチンのコンテナ再起動(ホスト再起動 / 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 が実際に(再)起動したときにのみ再解析されます。新しく再構築されたコンテナは、何らかの要因(ホスト再起動、docker restart、OOM など)で nginx が再起動されるまで、数日から数週間正常に動作し続ける可能性があります。その時点で、自動復旧なしにサイレントにクラッシュループ(約1回/秒)を開始します。
ワークアラウンド
/etc/nginx/nginx.conf の先頭行(メインコンテキスト、events {} の前)に include /etc/nginx/modules-enabled/*.conf; を追加してください。これにより nginx -t が成功し、正常な動作が復旧することが確認されています。
依頼
ベースイメージの nginx.conf にこの include を追加するか、ディストリビューションの nginx パッケージビルドがデフォルトで Brotli サポートをバンドルしなくなった場合、同梱の discourse.conf テンプレートから brotli_static/brotli を削除するかのいずれかに対応していただけますか?