Nginx entra en bucle de reinicios tras reiniciar el contenedor: la imagen base incluye brotli_static en discourse.conf pero nunca carga el módulo (directiva desconocida)

Resumen
Después de un reinicio rutinario del contenedor (reinicio del host / docker restart), nginx falla al iniciar dentro del contenedor app con el siguiente error:

nginx: [emerg] unknown directive "brotli_static" in /etc/nginx/conf.d/discourse.conf:172

Esto deja toda la web fuera de línea (sin alternativa: nginx nunca se vincula a los puertos 80/443) hasta que se aplica un parche manualmente.

Entorno

  • Imagen base: discourse/base:2.0.20260812-0036
  • nginx: 1.26.3-3+deb13u7 (paquete de Debian 13/trixie, no compilado a medida)
  • libnginx-mod-http-brotli-static/-filter 1.0.0~rc-6 están instalados, y los enlaces simbólicos en /etc/nginx/mods-enabled/*.conf (con las líneas correctas de load_module) existen y apuntan a archivos .so válidos.

Causa raíz
/etc/nginx/nginx.conf (propiedad del paquete nginx-common, sin modificaciones) no tiene la directiva include /etc/nginx/modules-enabled/*.conf;, por lo que los módulos Brotli instalados nunca se cargan, mientras que discourse.conf (generado por las plantillas de Discourse) sigue emitiendo brotli_static on; asumiendo que sí se cargan.

Por qué no falla inmediatamente
La configuración solo se vuelve a analizar cuando nginx realmente se (re)inicia. Un contenedor recién reconstruido puede funcionar bien durante días o semanas hasta que algo reinicie nginx (reinicio del host, docker restart, OOM, etc.), momento en el que comienza a entrar en un bucle de errores silencioso (~1 vez/seg) sin recuperación automática.

Solución temporal
Agregar include /etc/nginx/modules-enabled/*.conf; como la primera línea de /etc/nginx/nginx.conf (contexto principal, antes de events {}). Se ha confirmado que esto restaura el éxito de nginx -t y el funcionamiento normal.

Solicitud
¿Podría la imagen base hacer una de las siguientes cosas: (a) agregar este include a su nginx.conf, o (b) eliminar brotli_static/brotli de la plantilla discourse.conf incluida si la compilación del paquete nginx de la distribución ya no incluye soporte para Brotli de forma predeterminada?

2 Me gusta

Corrijo mi propio informe: la imagen base está bien. La causa era local a nuestra instalación.

Lo que realmente pasó

Un trabajo de cron local en nuestro host copia archivos de configuración de nginx desactualizados y mantenidos manualmente dentro del contenedor en ejecución. Uno de ellos es anterior a include /etc/nginx/modules-enabled/*.conf; y otro aún establece brotli_static on;. Juntos, producen el error unknown directive "brotli_static" y nginx se niega a iniciar.

Por qué lo diagnosticué mal

Inspeccioné /etc/nginx/nginx.conf dentro del contenedor en ejecución y encontré que faltaba la inclusión de modules-enabled. Ese archivo ya había sido sobrescrito localmente, por lo que el contenedor en ejecución nunca reflejaba lo que Discourse genera realmente. Revisar la imagen construida en su lugar lo hace obvio. La inclusión está ahí:

docker create --name check local_discourse/app
docker cp check:/etc/nginx/nginx.conf ./
docker rm check

Por qué se manifestó con retraso

Esta podría ser la parte útil para otros. El trabajo termina con nginx -s reload y descarta su salida. Cuando la configuración está rota, la recarga falla en silencio y el nginx en ejecución sigue sirviendo desde su configuración ya cargada. Todo parece saludable. El fallo solo se vuelve visible en el próximo inicio real de nginx, que en nuestro caso fue un reinicio del host por una actualización del kernel no supervisada días después.

Así que, si un contenedor de Discourse ha estado sirviendo tráfico correctamente y luego muere en un reinicio no relacionado, comprueba si algo sobrescribió su configuración de nginx en el meantime.

Disculpas por el ruido y gracias a quien haya dedicado tiempo a revisar esto.

1 me gusta