Резюме
После плановой перезагрузки контейнера (перезагрузка хоста / docker restart) nginx не запускается внутри контейнера app с ошибкой:
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 раза в секунду) без автоматического восстановления.
Временное решение
Добавьте include /etc/nginx/modules-enabled/*.conf; в качестве первой строки в /etc/nginx/nginx.conf (в основном контексте, перед events {}). Подтверждено, что это восстанавливает успешную проверку nginx -t и нормальную работу.
Вопрос
Можно ли в базовом образе либо (a) добавить этот include в его nginx.conf, либо (b) убрать brotli_static/brotli из поставляемого шаблона discourse.conf, если сборка пакета nginx для дистрибутива больше не включает поддержку Brotli по умолчанию?