컨테이너 재시작 후 Nginx가 크래시 루프에 빠짐: 기본 이미지에서 discourse.conf에 brotli_static이 포함되어 있지만 모듈이 로드되지 않아 unknown directive 오류 발생

요약
루틴 컨테이너 재시작(호스트 재부팅 / 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/-filter 1.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 등)가 발생하기까지 며칠에서 몇 주 동안 정상적으로 실행될 수 있습니다. 이 시점에 nginx는 자동 복구 없이 조용히 크래시 루프(~1초/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를 제거하는 것입니다.

2개의 좋아요