Riepilogo
Dopo un normale riavvio del contenitore (riavvio dell’host / docker restart), nginx non riesce ad avviarsi all’interno del contenitore app con il seguente errore:
nginx: [emerg] unknown directive "brotli_static" in /etc/nginx/conf.d/discourse.conf:172
Questo porta l’intero sito offline (nessun fallback — nginx non si lega mai alle porte 80/443) fino a quando non viene applicata una patch manuale.
Ambiente
- Immagine base:
discourse/base:2.0.20260812-0036 - nginx:
1.26.3-3+deb13u7(pacchetto Debian 13/trixie, non compilato su misura) - Sono installati
libnginx-mod-http-brotli-static/-filter1.0.0~rc-6 e i symlink in/etc/nginx/mods-enabled/*.conf(con le righeload_modulecorrette) esistono e puntano a file.sovalidi.
Causa principale
/etc/nginx/nginx.conf (di proprietà del pacchetto nginx-common, non modificato) non contiene la direttiva include /etc/nginx/modules-enabled/*.conf;, quindi i moduli Brotli installati non vengono mai caricati — mentre discourse.conf (generato dai template di Discourse) continua a emettere brotli_static on; dando per scontato che lo siano.
Perché non fallisce immediatamente
La configurazione viene rielaborata solo quando nginx si (ri)avvia effettivamente. Un contenitore appena ricostruito può funzionare correttamente per giorni/settimane fino a quando qualcosa non riavvia nginx (riavvio dell’host, docker restart, OOM, ecc.), a quel punto inizia a entrare in crash-loop in modo silenzioso (~1×/sec) senza alcun recupero automatico.
Soluzione temporanea
Aggiungere include /etc/nginx/modules-enabled/*.conf; come prima riga di /etc/nginx/nginx.conf (contesto principale, prima di events {}). Confermato che questo ripristina il successo di nginx -t e il funzionamento normale.
Richiesta
L’immagine base potrebbe (a) aggiungere questo include al suo nginx.conf, oppure (b) rimuovere brotli_static/brotli dal template discourse.conf fornito se la build del pacchetto nginx della distribuzione non include più il supporto Brotli in modo predefinito?